在使用线程池进行多进程的时候,传入Queue去做进程中的通信的时候发现,子进程没有运行就退出了,比如如下写:
from multiprocessing import Pool, Queue
def test(q):
print("start")
while not q.empty():
value = q.get()
print('Get %s from queue.' % value)
if __name__=='__main__':
q = Queue()
for i in range(4):
q.put(i)
p = Pool(4)
for i in range(4):
p.apply_async(test, args=(q,))
p.close()
p.join()
print("down")
子进程怎么没有运行,于是我就测试了一下,发现子进程真的没有运行。
将其中的参数q换成普通参数就能完整运行,说明问题出现在传入的参数为multiprocessing Queue的为提上,于是乎谷歌一下找到以下:
python - Sharing a result queue among several processes - Stack Overflow
所以不用multiprocessing提供的Queue, 而是使用multiprocessing.Manager来管理队列,于是简单修改一下代码如下:
from multiprocessing import Pool, Manager
def test(q):
print("start")
while not q.empty():
value = q.get()
print('Get %s from queue.' % value)
if __name__=='__main__':
m = Manager()
q = m.Queue()
for i in range(4):
q.put(i)
p = Pool(4)
for i in range(4):
p.apply_async(test, args=(q,))
p.close()
p.join()
print("done")
看到结果是正确的。
查阅官方文档显示:
A manager object returned by Manager() controls a server process which holds Python objects and allows > > other processes to manipulate them using proxies.
A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore,
BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.
可以看出multiprocess.Manager()可以用来管理临界区。