检测多处理队列何时为空并关闭
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
.
一样
假设我有两个进程:一个 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
.