与多个从属进程通信(每个从属进行一次多处理.Queue实例)

时间:2016-06-07 14:15:04

标签: python python-multiprocessing

我已经设计了一种通过在多个从属进程之间分配工作来并行化某个任务的方法。所以我提出的设计是:

  • 主进程在每个启动的进程中创建一个multiprocessing.Queue实例。
  • 然后,主任务通过multiprocessing.Process创建从属进程,并传递此特定子进程应用于与主进程通信的multiprocessing.Queue实例。
  • 接下来,这是关键部分,主进程等待所有multiprocessing.Queue个实例。每次在任何队列上都有活动时,我希望它被唤醒,读取从属进程在该特定队列中放置的任何消息并对其执行某些操作。

正如我已经指出的那样,最后一点是难点,因为我无法在Python的多处理参考中找到任何可以让我等待 MULTIPLE multiprocessing.Queue个实例。我基本上需要像Microsoft WaitForMultipleObjects或POSIX select这样的东西,除了multiprocessing.Queue个对象。代替这样的功能,我想我可以让我的主进程忙于等待/轮询从属进程队列,在各个轮询周期之间有适当的休眠间隔,但这是我想要避免的事情,除非那里有别无他法。此外,虽然我在Windows计算机上,但我对实施任何特定于Windows的解决方案犹豫不决,因为我希望尽可能保持与平台无关的内容。

有没有人有任何想法?

编辑:忘记提及主人和奴隶都是关于这些队列的读者和作者。

编辑:为了排除混乱,我必须将特定子流程排入队列并且不能将其传递给任意子流程的原因是我在ClearCase VOB中搜索动态链接并且在特定VOB上运行多个进程实际上可能会减慢速度。我想要每个VOB只有一个子进程,并且该进程应该是唯一一个在该VOB中搜索链接的进程。

1 个答案:

答案 0 :(得分:2)

这听起来像是一个任务队列

https://en.wikipedia.org/wiki/Thread_pool

但是单向队列将更容易使用。

您希望使用一个队列向相应的线程发出作业。完成的任务可以在单独的队列中返回,以便主服务器可以等待。如果线程创建了一个新任务,则可以采用相同的方式处理 - 主线程可以为相应的工作者重新发布它。

但是,如果每个worker都有自己的任务队列,那么似乎没有任何理由将多线程控制放在那些队列上。它们可以在内部运行1个线程,并具有分配新任务的成员函数。主线程更像是一个调度程序,它只是将任务直接分配给应该处理它的对象,然后在分配任务之间等待响应队列。