使用池实现并发服务器

进程池线程池并发服务器

 

# -*- coding: utf-8 -*-
""" 进程池和线程池实现并发
    socket编程共两个阻塞的地方,生成对等套接字和接收数据
    1.将生成对等套接字给进程池
    2.将接收数据交给线程池(进程池中)
 """
from multiprocessing.pool import ThreadPool
from multiprocessing import Pool, cpu_count # 获取机器cpu数量

import socket


def process_worker(server):
    thread_pool = ThreadPool(4)
    while True:
        conn, addr = server.accept() # 对等连接套接字
        thread_pool.apply_async(thread_worker, args=(conn, ))
    # thread_pool.join()

def thread_worker(conn):
    while True:
        recv_data = conn.recv(1024)
        if recv_data:
            print(recv_data.decode())
            conn.send(recv_data)
        else:
            conn.close()
            break

def main():
    server = socket.socket()
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 释放端口
    server.bind(("", 8000))
    server.listen(1000)  # 监听套接字

    pool = Pool(cpu_count())  # 生成进程池

    for i in range(cpu_count()):
        pool.apply_async(process_worker, args=(server, ))
    pool.close()
    print('apply is starting!!!')
    pool.join()

if __name__ == "__main__":
    main()

奇怪的是在windows下运行出错,在linux没出错。

    recv_data = client.recv(1024) # 该处出错
ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。

 

上一篇:python 网络 socket


下一篇:网络IO模型