我想使用 Python
Pool.map()
模块中的 multiprocessing
运行许多可以中断的函数(例如使用 ctrl+C
)。
我找不到一种方法可以做到这一点并保留已完成的功能评估的数据,同时跳过待处理的结果。当前运行的进程是否完成或终止并不重要。
我在使用
KeyboardInterrupt
中断时尝试了以下操作,但在这种情况下 output
不会被定义。
from multiprocessing import Pool
from time import sleep
def f(i):
sleep(i)
return i
with Pool() as p:
try:
output = p.map(f, range(10))
except KeyboardInterrupt:
p.close()
print(output)
您无法使用
pool.map()
执行此操作。 pool.map()
将阻塞,直到输出准备好。因此,它实际上是全有或全无。您也不能使用 map_async
,因为即使它不会阻塞,它的输出仍然是全有或全无。
您要么必须对每个任务使用池的
apply_async
方法,并在输出到达时手动跟踪输出(这将涉及按一定时间间隔进行轮询),或者以类似的方式直接使用 Process
实例。
此外,您可能必须在主线程和子进程中配置信号处理程序。