结论:python多进程间用Queue通信时,如果子进程操作Queue满了或者内容比较大的情况下,该子进程会阻塞等待取走Queue内容(如果Queue数据量比较少,不会等待),如果调用join,主进程将处于等待,等待子进程结束,造成死锁
解决方式:在调用join前,及时把Queue的数据取出,而且Queue.get需要在join前
原理分析
模拟子进程阻塞:
from multiprocessing import Process, Queue
def fun(q):
num = 1000000000
q.put('=' * num)
print("done put")
if __name__ == '__main__':
queue = Queue()
p = Process(target=fun, args=(queue,))
p.start()
p.join()
print("done")
原因分析:
#
# Queue type using a pipe, buffer and thread
#
class Queue(object):
multiprocessing.Queue底层是基于Pipe构建,操作系统管道不是无限长,因此子进程在执行put()期间,处于阻塞,直到某些其他进程使用get()从队列中取走数据。上例中,主进程等待子进程,打印不了do