使用队列和多处理时出现死锁

时间:2015-07-19 22:32:26

标签: python multithreading multiprocessing python-multithreading python-multiprocessing

我不理解多处理文档(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)。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:5)

此示例说明了17.2.2.2.

中描述的行为
  

如果子进程已将项目放入队列(并且它未使用JoinableQueue.cancel_join_thread),则在将所有缓冲的项目刷新到管道之前,该进程不会终止。   这意味着,如果您尝试加入该进程,则可能会遇到死锁,除非您确定已经使用了已放入队列的所有项目。