Python 遍历多处理队列

Python 遍历多处理队列,python,python-3.x,Python,Python 3.x,我有两个多处理线程,一个向队列添加项目,另一个需要遍历当前队列。如何进行迭代?或者,如何将当前队列转换为列表以进行迭代 一些伪代码: import multiprocessing as mp thequeue = mp.Queue() def func1(): global thequeue while True: item = readstream() if item not None: thequeue.put(item

我有两个多处理线程,一个向队列添加项目,另一个需要遍历当前队列。如何进行迭代?或者,如何将当前队列转换为列表以进行迭代

一些伪代码:

import multiprocessing as mp
thequeue = mp.Queue()
def func1():
    global thequeue
    while True:
        item = readstream()
        if item not None:
            thequeue.put(item)
def func2():
    while True:
        for item in thequeue:    # This only works for Lists, how to do this for queues?
            if item == "hi":
                print(item)
main():
    mp.Process(target=func1).start()
    mp.Process(target=func2).start()

multiprocessing.Queue
不直接支持迭代,因为在容器上循环的
for
预期不会修改容器。这种非破坏性的迭代既不可能在
多处理.Queue
实现中得到支持,也根本不适合用于
多处理.Queue
用例的操作

消费者应使用
get
,它从队列中检索和删除项目:

def func2():
    while True:
        item = thequeue.get()
        if item == 'hi':
            print(item)

如果您喜欢
for
循环的
代码结构,您可以使用两个参数
iter
,如Sraw的回答所示,但仍将从队列中删除项目。在不删除项目的情况下,不可能在
多处理.Queue
上迭代。

如果您想以
for
循环的形式编写代码,可以使用:

要停止此过程,您只需将
None
放入
队列
,或者如果
None
在您的情况下很常见,您可以自行发出停止信号


请注意,与正常的
for
循环不同,这将从队列中删除项目,就像手动调用
get
一样。在不删除项的情况下,无法遍历进程间队列。

这不是一个简单的工作示例。这个问题缺乏很多细节,首先是-您是如何在Python中创建线程的?您使用的队列类是什么?添加了更多代码@VictorSergienkoThis,我相信:注意,如果有多个进程进入队列,这可能不起作用。很难弄清楚哪一家生产商必须不插手。在这种情况下,@user2357112的答案虽然更难看,但更容易理解implement@gokul_uf你误解了。在主线程中加入所有生产者,然后将
None
放入。制作人不必在意它。它怎么会“根本不合适”?正如另一个答案所示,为其构建和使用生成器是很简单的。@pmos:使用标准的
for
循环在容器上迭代是非破坏性的,但是
多处理。队列
不能支持非破坏性迭代,非破坏性迭代与使用
multiprocessing.Queue
作为消息传递同步机制背道而驰。您可以使用
iter
构造从队列馈送的迭代器,然后对其进行迭代,但不能直接对队列进行迭代,而且,
multiprocessing.Queue
几乎肯定不会支持直接迭代。而且,它不是生成器。生成器是一种特定类型的迭代器,它不是两个参数
iter
创建的类型,但是你自己说,使用
for
的迭代只对容器是非破坏性的-使用
for
的非容器上的破坏性迭代完全是惯用和普通的Python:例如,在文件对象或标准流上迭代(如果以文本模式打开,则生成行)、生成器等等。。。
def func2():
    for item in iter(thequeue.get, None):
        # do what you want