使用队列在进程之间进行通信

时间:2019-03-10 17:21:36

标签: python python-3.x multiprocessing

我在第一个池中有一个进程A,在第二个池中有多个进程B1..Bk,我想将项目放入A中的队列,并在B1..Bk中使用项目。

我的第一个尝试是只创建multiprocessing.Queue并将其传递给所有这些进程。但这给了我错误

RuntimeError: Queue objects should only be shared between processes through inheritance

我发现了一些建议,建议改用multiprocessing.Manager()。Queue()。但是当我这样做并尝试从Bi中的队列中读取时,我得到了错误

TypeError: 'AutoProxy[Queue]' object is not iterable

那么正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

好的,这只是我的愚蠢,我误解了队列是什么! 最重要的是,队列是不可迭代的,因此不能“为某些情况而行”。 (我的错误是认为队列代理是不可迭代的,因为它是代理。但是,如果使用put / get,则该代理可以很好地代替实际队列) 另外,(FIFO)队列无法关闭并且没有自然的“结束”,我发现这很烦人,因为这意味着一个队列必须发送特殊的“队列结束”条目,但不要过多地发送它们以防止无意间阻塞队列。

因此,最重要的是:要共享队列,我创建了一个multiprocessing.Manager()。Queue()并将其传递,然后我使用put / get在不同进程中写入/读取队列,并发送一些特殊的消息。进入阅读器以指示工作已结束。

尽管队列不能关闭并且使用者获得“队列结束”条件,这确实很烦人,尤其是在出现错误情况时:如果一个队列被k个使用者消耗,那么编写者必须知道k和发送k个工作结束指标,并且k个消费者都必须表现得很好才能取回这些指标并关闭。如果有任何错误,将无法再保证所有这些,例如消费者可能锁定或超时,以等待永远不会到达的工作结束指示。