看来以下两个片段具有相同的行为:
def sqr(a):
time.sleep(1.2)
print 'local {}'.format(os.getpid())
if a == 20:
raise Exception('fff')
return a * a
pool = Pool(processes=4)
A:
try:
r = [pool.apply_async(sqr, (x,)) for x in range(100)]
pool.close()
for item in r:
item.get(timeout=999999)
except:
pool.terminate()
raise
finally:
pool.join()
print 'main {}'.format(os.getpid())
B:
r = [pool.apply_async(sqr, (x,)) for x in range(100)]
pool.close()
for item in r:
item.get(timeout=999999)
pool.join()
最初我想如果我不这样做terminate
,即使主进程退出,所有其他进程也会在后台运行。但我查了一下htop
一旦发生异常,所有子进程似乎都会退出。
你打电话时pool.close() https://docs.python.org/2.7/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.close,你告诉的是Pool
不会再向其发送更多任务。这允许它在当前任务队列处理完成后立即关闭其工作进程 - 没有明确的terminate()
需要打电话。文档中提到了这一点:
close()
防止将更多任务提交到池中。一旦所有任务完成,工作进程将退出。
请注意,任务是否成功完成或抛出异常并不重要;不管怎样,任务就完成了。
此外,所有工作进程Pool
开始于daemon=True https://docs.python.org/2.7/library/multiprocessing.html#multiprocessing.Process.daemon,这意味着一旦父进程准备退出,它们就会被终止。在你的情况下,你打电话get()
在正在处理的每个项目上,这将导致在子级中引发的异常在父级中重新引发。当这种情况发生时,父进程退出,这会自动终止所有工作进程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)