用进程池和线程池实现高并发服务器
思想:
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()
图例:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构