我不理解多处理文档(python.org)的这一部分,我引述:
"将出现死锁的示例如下:
from multiprocessing import Process, Queue
def f(q):
q.put('X' * 1000000)
if __name__ == '__main__':
queue = Queue()
p = Process(target=f, args=(queue,))
p.start()
p.join() # this deadlocks
obj = queue.get()
" 首先,它为什么阻止? 更令人惊讶的是,当我在f的定义中尝试使用小于1000000的小值时,它的效果非常好(它适用于10,100,1000,10000,但不适用于100000)。
非常感谢你的帮助!
答案 0 :(得分:5)
此示例说明了17.2.2.2.
中描述的行为如果子进程已将项目放入队列(并且它未使用JoinableQueue.cancel_join_thread),则在将所有缓冲的项目刷新到管道之前,该进程不会终止。 这意味着,如果您尝试加入该进程,则可能会遇到死锁,除非您确定已经使用了已放入队列的所有项目。