我正在学习多处理,但是当我想创建一个进程池时,遇到一个问题。我的代码是:
from multiprocessing import Pool, Queue
def read(q):
print("flag")
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(read, args=(q,))
p.close()
p.join()
print("down")
子进程似乎未运行,子进程没有输出。结果是
down
我想它与参数有关,所以我更改了代码:
from multiprocessing import Pool, Queue
def read(i):
print("flag")
print(i)
#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(read, args=(i,))
p.close()
p.join()
print("down")
结果是:
flag
0
flag
2
flag
1
flag
3
down
进程已输出。那么为什么以前的代码无法正确运行?
感谢帮助。
答案 0 :(得分:1)
您的第一个问题是必须对get()
的每个结果调用apply_async()
,否则将不会发生任何事情。例如,尝试以下操作:
if __name__=='__main__':
q = Queue()
for i in range(4):
q.put(i)
p = Pool(4)
results = []
for i in range(4):
results.append(p.apply_async(read, args=(q,)))
p.close()
p.join()
for result in results:
print(result.get())
print("down")
这会给你一个错误:
RuntimeError:队列对象仅应通过继承在进程之间共享
您的第二个问题是您没有正确使用队列-请参阅此处:Sharing a result queue among several processes