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

时间:2018-02-01 18:44:47

标签: python python-multiprocessing

我们说我有两个过程:读者和作家。作者如何检测读者何时完成写入值?

multiprocessing模块a queue with a close method似乎是为此目的而定制的。但是如何检测队列何时关闭?

这似乎不起作用,因为作者永远不会退出:

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()

读写器对是否应使用标记值来表示写入结束?那么采用close方法的重点是什么?

编辑:当this question询问队列模块(现在是queue)时,我会特别询问mp.Queue以及.close方法的正确用法。

1 个答案:

答案 0 :(得分:3)

  

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

你不是。这不是close的目的。调用close甚至不能保证不再向队列添加任何项目; docs

  

表示当前流程不会在此队列中添加更多数据

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

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