在Python多处理中,当子进程将数据写入Queue而没有人读取数据时,子进程不会退出。为什么

时间:2019-02-09 12:11:14

标签: python multiprocessing

我有一个python代码,其中主进程创建了一个子进程。这两个进程之间有一个共享队列。子进程将一些数据写入此共享队列。主进程join()位于子进程上。

如果未使用get()除去队列中的数据,则子进程不会终止,并且主进程在join()被阻止。为什么会这样。

以下是我使用的代码:

from multiprocessing import Process, Queue
from time import *

def f(q):
    q.put([42, None, 'hello', [x for x in range(100000)]])
    print (q.qsize())
    #q.get()
    print (q.qsize())

q = Queue()
print (q.qsize())
p = Process(target=f, args=(q,))
p.start()
sleep(1)
#print (q.get())
print('bef join')
p.join()
print('aft join')

目前q.get()已被注释,因此输出为:

0
1
1
bef join

,然后代码被阻止。 但是,如果我取消对q.get()调用之一的注释,则代码将完全运行,并显示以下输出:

0
1
0
bef join
aft join

1 个答案:

答案 0 :(得分:2)

好吧,如果您查看Queue documentation,它会明确指出

Queue.join:Blocks until all items in the queue have been gotten and processed。在我看来,join()如果不清空队列就阻塞程序。

对我来说,您需要了解多处理的哲学。您有几个任务不需要彼此运行,而您的程序目前对您来说太慢了。您需要使用多进程

但是请不要忘记,(相信我)是时候需要等待,直到完成一些并行计算,因为您需要所有这些元素可以完成您的下一个任务。就您而言,这就是join()进入的地方。您基本上是在说:I was doing things asynchronously. But now, my next task needs to be synced with the different items I computed before. Let's wait here until they are all ready.