python - 使用队列进行进程间通信
问题描述
我在第一个池中有一个进程 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
那么正确的方法是什么?
解决方案
好吧,这只是我的愚蠢,我误解了队列是什么!最重要的是,队列是不可迭代的,因此不能“for el in somequeue”。(我的错误是认为队列代理是不可迭代的,因为它是代理。但是,如果使用 put/get,则代理可以代替实际队列正常工作)此外,(FIFO)队列无法关闭并且不会有一个自然的“结束”,我觉得这很烦人,因为这意味着一个人必须发送特殊的“队列结束”条目,但不要太多,以免无意中阻塞队列。
所以底线是:为了共享队列,我创建了一个 multiprocessing.Manager().Queue() 并传递它,然后我使用 put/get 在不同的进程中写入/读取队列,并发送一些特殊的条目到读者指示工作结束。
队列无法关闭并且消费者得到“队列结束”的情况确实很烦人,尤其是在出现错误情况时:如果队列被 k 个消费者消费,那么编写者必须知道 k 并发送 k end工作指标和 k 个消费者都必须表现良好才能检索这些并关闭。如果有任何错误,所有这一切都无法再得到保证,例如,消费者可能会锁定或超时等待永远不会到达的作业结束指示器。
推荐阅读
- java - Java 装饰图案披萨浇头
- android - 如何在android中的天,小时(24),分钟(60),秒(60)中获取两个日期之间的差异
- xslt - 哪个更快 xsl:function 或 xsl:call-template
- android - 无法通过android中的意图传递数据
- angular - 使用 Angular2 进行翻译
- java - 方法调用 getActivity().getSupportFragmentManager() 可能会在片段中产生空指针异常
- graph - ArangoDB 中优化的推荐引擎
- amazon-web-services - DynamoDB 最终一致性读取 vs 强一致性读取
- mysql - 库存可用性能Mysql
- google-cloud-platform - 统计指定时间内的 GCP 日志条目数