检测何时多处理队列为空并关闭

Dan*_*ats 3 python python-multiprocessing

假设我有两个过程:一个读者和一个作家。作者如何检测读者何时完成了价值写作?

该multiprocessing模块有一个带有close方法的队列,该方法似乎是为此目的定制的。但是,如何检测队列何时关闭?

这似乎不起作用,因为作者从未退出过:

import multiprocessing as mp

def getter(q):
    while True:
        try:
            print(q.get())
        except Exception:
            break

def putter(q):
    q.put(1)
    q.put(2)
    q.close()

q = mp.Queue()
writer = mp.Process(target=putter, args=(q, ))
reader = mp.Process(target=getter, args=(q, ))
reader.start()
writer.start()

writer.join()
reader.join()
Run Code Online (Sandbox Code Playgroud)

读写器对应该使用标记值来表示写入结束吗?那么使用该close方法有什么意义呢?

编辑:虽然这个问题询问有关Queue模块(现在称为queue),但我专门询问的是mp.Queue什么以及该.close方法的正确用法是什么。

use*_*ica 6

但是,如何检测队列何时关闭?

你不知道 那不是目的close。调用close甚至不能保证不会有更多的项目添加到队列中。该文件说,

指示当前进程不会再将更多数据放入此队列。

close 旨在关闭该队列的当前进程的馈送线程(或至少开始关闭它),而不是将队列结束传递给其他进程。


如果您想发出不再将更多值写入队列的信号,请使用标准技术,例如使哨兵对象排队,就像使用普通方法一样queue.Queue。