首页 > 解决方案 > 使用队列进行进程间通信

问题描述

我在第一个池中有一个进程 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

那么正确的方法是什么?

标签: pythonpython-3.xmultiprocessing

解决方案


好吧,这只是我的愚蠢,我误解了队列是什么!最重要的是,队列是不可迭代的,因此不能“for el in somequeue”。(我的错误是认为队列代理是不可迭代的,因为它是代理。但是,如果使用 put/get,则代理可以代替实际队列正常工作)此外,(FIFO)队列无法关闭并且不会有一个自然的“结束”,我觉得这很烦人,因为这意味着一个人必须发送特殊的“队列结束”条目,但不要太多,以免无意中阻塞队列。

所以底线是:为了共享队列,我创建了一个 multiprocessing.Manager().Queue() 并传递它,然后我使用 put/get 在不同的进程中写入/读取队列,并发送一些特殊的条目到读者指示工作结束。

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


推荐阅读