用进程池和线程池实现高并发服务器

思想:

  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()

图例:

  

猜你喜欢

转载自www.cnblogs.com/cxhzy/p/10007035.html
今日推荐