【发布时间】:2020-03-30 10:40:49
【问题描述】:
当你向multiprocessing.Queue 提供一个足够大的对象时,程序似乎挂在奇怪的地方。考虑这个最小的例子:
import multiprocessing
def dump_dict(queue, size):
queue.put({x: x for x in range(size)})
print("Dump finished")
if __name__ == '__main__':
SIZE = int(1e5)
queue = multiprocessing.Queue()
process = multiprocessing.Process(target=dump_dict, args=(queue, SIZE))
print("Starting...")
process.start()
print("Joining...")
process.join()
print("Done")
print(len(queue.get()))
如果SIZE 参数足够小(至少在我的情况下SIZE 足够大,程序就会挂在奇怪的地方.现在,在搜索解释时,即python multiprocessing - process hangs on join for large queue,我总是看到“你需要从队列中消费”的一般答案。但看起来很奇怪的是程序实际上打印了Dump finished,即在将对象放入queue 之后到达代码行。此外,使用 Queue.put_nowait 而不是 Queue.put 并没有什么不同。
最后,如果您使用Process.join(1) 而不是Process.join(),整个过程将完成队列中有完整的字典(即print(len(..)) 行将打印10000)。
谁能给我更多的见解?
【问题讨论】:
-
代码在队列中插入一个包含 10000 个元素的字典。这是你想要的还是你试图插入每个 dict 项目?
-
@Pynchia 是的,正如我所说的,我知道我在那里放了一个巨大的物体(这是“虚拟”示例)。对我来说似乎很奇怪的是代码的行为(即我希望冻结
Queue.put,如果我在那里设置超时,肯定不会“成功”。我希望得到某种解释(或链接以供进一步阅读。 ..)
标签: python multiprocessing queue python-multiprocessing