Python多处理队列扩展到大量工作者

时间:2011-10-19 13:40:27

标签: python message-queue multiprocessing

我有一个启动工作进程的python(2.6.5 64位,Windows 2008 Server R2)应用程序。父进程将作业放入作业队列中,工作人员从中获取作业。同样,它有一个结果队列。每个工作人员通过查询服务器来执行其工作。工人的CPU使用率很低。

当工作人员数量增加时,服务器上的CPU使用率实际上会缩小。服务器本身不是瓶颈,因为我可以从其他应用程序中进一步加载它们。

其他人看到过类似行为吗?当大量进程正在读取或写入相同队列时,python多处理队列是否存在问题?

3 个答案:

答案 0 :(得分:1)

性能约束的两个不同想法:

  1. 瓶颈是工人互相争斗以及父母可以访问作业队列。
  2. 瓶颈是服务器上的连接速率限制(syn-flood protection)。
  3. 收集更多信息:

    1. 描述完成的工作量:每秒完成的任务,将其用作核心性能指标。
    2. 使用数据包捕获查看网络级延迟的网络活动。
    3. 让您的员工记录他们等待访问作业队列的时间。
    4. 可能的改进:

      1. 让您的员工使用持久连接(如果可用/适用)(例如HTTP)。
      2. 将任务拆分为多个作业队列,供给工作人员。

答案 1 :(得分:0)

除非您提供所有详细信息,否则不确定发生了什么。

但是,请记住,真正的并发性受实际硬件线程数量的限制。如果启动的进程数远远大于实际的硬件线程数,那么在某些时候,上下文切换开销将超过拥有更多并发进程的好处。

答案 2 :(得分:0)

创建新的thead是非常昂贵的操作。

控制大量并行网络连接的最简单方法之一是使用支持异步套接字的无堆栈线程。 Python有很大的支持和一堆库。

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