Python多进程队列扩展到大量工作线程
我有一个用Python写的应用程序(版本是2.6.5,64位,运行在Windows 2008 Server R2上),这个程序会启动一些工作进程。父进程会把任务放到一个任务队列里,工作进程会从这个队列中取任务来做。同样,它还有一个结果队列。每个工作进程通过查询服务器来完成自己的任务。工作进程的CPU使用率很低。
当工作进程的数量增加时,服务器的CPU使用率反而下降了。服务器本身并不是瓶颈,因为我可以通过其他应用程序让它们的负载更高。
有没有人遇到过类似的情况?当有很多进程同时读写同一个队列时,Python的多进程队列会不会出现问题?
3 个回答
0
创建新的线程是一项非常耗费资源的操作。
控制很多并行网络连接的一个简单方法是使用无栈线程,并支持异步套接字。Python对此有很好的支持,还有很多相关的库。
我最喜欢的库是 gevent,它有一个非常棒且完全透明的猴子补丁工具。
0
不太清楚发生了什么,除非你提供所有的细节。
不过,要记住,真正的并发是受限于实际的硬件线程数量。如果启动的进程数量远远超过了实际的硬件线程数量,那么在某个时刻,切换进程的开销会超过同时运行更多进程带来的好处。
1
关于性能限制的两个不同想法:
- 瓶颈在于工人们为了争抢工作队列的访问权而互相竞争,以及与父进程之间的争斗。
- 瓶颈在于服务器的连接速率限制(比如防止同步洪水攻击的保护措施)。
收集更多信息的方法:
- 分析完成的工作量:每秒完成的任务数量,把这个作为你主要的性能指标。
- 使用数据包捕获工具查看网络活动,以找出网络延迟的问题。
- 让你的工人记录他们等待访问工作队列的时间。
可能的改进措施:
- 如果可以的话,让你的工人使用持久连接(比如HTTP)。
- 把任务分成多个工作队列,分配给不同的工人池来处理。