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