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

Detect when multiprocessing queue is empty and closed

假设我有两个进程:一个 reader 和一个 writer。编写器如何检测 reader 何时完成写入值?

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

reader-writer 对是否应该使用标记值来表示写入结束?那么 close 方法有什么意义呢?

编辑:虽然 this question asks about the Queue module (now queue),我特别询问 mp.Queue 以及 .close 方法的正确用法是什么。

But how do you detect when the queue has been closed?

你不知道。这不是 close 的目的。调用 close 甚至不能保证不再有项目添加到队列中; docs

Indicate that no more data will be put on this queue by the current process.

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


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

一样