我有一个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
答案 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.