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

思想:

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

图例:

  

 

转载于:https://www.cnblogs.com/cxhzy/p/10007035.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值