Python多进程队列扩展到大量工作线程

1 投票
3 回答
1571 浏览
提问于 2025-04-17 04:37

我有一个用Python写的应用程序(版本是2.6.5,64位,运行在Windows 2008 Server R2上),这个程序会启动一些工作进程。父进程会把任务放到一个任务队列里,工作进程会从这个队列中取任务来做。同样,它还有一个结果队列。每个工作进程通过查询服务器来完成自己的任务。工作进程的CPU使用率很低。

当工作进程的数量增加时,服务器的CPU使用率反而下降了。服务器本身并不是瓶颈,因为我可以通过其他应用程序让它们的负载更高。

有没有人遇到过类似的情况?当有很多进程同时读写同一个队列时,Python的多进程队列会不会出现问题?

3 个回答

0

创建新的线程是一项非常耗费资源的操作。

控制很多并行网络连接的一个简单方法是使用无栈线程,并支持异步套接字。Python对此有很好的支持,还有很多相关的库。

我最喜欢的库是 gevent,它有一个非常棒且完全透明的猴子补丁工具。

0

不太清楚发生了什么,除非你提供所有的细节。

不过,要记住,真正的并发是受限于实际的硬件线程数量。如果启动的进程数量远远超过了实际的硬件线程数量,那么在某个时刻,切换进程的开销会超过同时运行更多进程带来的好处。

1

关于性能限制的两个不同想法:

  1. 瓶颈在于工人们为了争抢工作队列的访问权而互相竞争,以及与父进程之间的争斗。
  2. 瓶颈在于服务器的连接速率限制(比如防止同步洪水攻击的保护措施)。

收集更多信息的方法:

  1. 分析完成的工作量:每秒完成的任务数量,把这个作为你主要的性能指标。
  2. 使用数据包捕获工具查看网络活动,以找出网络延迟的问题。
  3. 让你的工人记录他们等待访问工作队列的时间。

可能的改进措施:

  1. 如果可以的话,让你的工人使用持久连接(比如HTTP)。
  2. 把任务分成多个工作队列,分配给不同的工人池来处理。

撰写回答