用进程池和线程池实现高并发服务器
思想:
1. 创建与服务器相同cpu个数的进程个数来监听(accept)客户端响应,并在每个进程中先创建好一个线程池
2. 有客户端访问时,解除其中一个进程的accpet阻塞,进入到线程中来执行接收数据工作( recv() ),用线程防止recv阻塞,线程调用recv方法
3. main主函数调用时,最后要加pool.close()和pool.join
代码:
import socket
from multiprocessing import Pool,cpu_count
from multiprocessing.pool import ThreadPool
def worker_process(server): #处理server进程
thread_pool = ThreadPool(cpu_count()) #每个进程开一个线程池
while True:
conn,addr = server.accept()
thread_pool.apply_async(worker_recv,args=(conn,))
def worker_recv(conn): #在线程中处理
while True:
data = conn.recv(1024)
if data:
print(data.decode())
conn.send(data)
else:
conn.close()
if __name__ == '__main__':
server = socket.socket()
server.bind(('127.0.0.1', 7778))
server.listen(1000)
n = cpu_count() #本机的cpu个数
pool = Pool(n)
for i in range(n):
pool.apply_async(worker_process,args=(server,))
pool.close()
pool.join()
图例: