在这份文档(https://pymotw.com/3/concurrent.futures/)中说到:
"ProcessPoolExecutor 的工作方式与 ThreadPoolExecutor 相同,但使用进程而不是线程。这使得 CPU 密集型操作可以使用单独的 CPU,并且不会被 CPython 解释器的全局解释器锁定阻塞。"
听起来很不错!它还说:
"如果发生了某些事情导致其中一个工作进程意外退出,那么 ProcessPoolExecutor 将被认为是“broken”,并且将不再调度任务。"
听起来很糟糕 :( 所以我的问题是:什么被认为是“意外”?这是否意味着退出信号不为1?我可以安全地退出线程并继续处理队列吗?以下是示例:
from concurrent import futures
import os
import signal
with futures.ProcessPoolExecutor(max_workers=2) as ex:
print('getting the pid for one worker')
f1 = ex.submit(os.getpid)
pid1 = f1.result()
print('killing process {}'.format(pid1))
os.kill(pid1, signal.SIGHUP)
print('submitting another task')
f2 = ex.submit(os.getpid)
try:
pid2 = f2.result()
except futures.process.BrokenProcessPool as e:
print('could not start new tasks: {}'.format(e))