如何在不丢失已使用 python 多处理计算结果的情况下中断 Pool.map?

问题描述 投票:0回答:1

我想使用 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)
python multiprocessing interrupt
1个回答
0
投票

您无法使用

pool.map()
执行此操作。
pool.map()
将阻塞,直到输出准备好。因此,它实际上是全有或全无。您也不能使用
map_async
,因为即使它不会阻塞,它的输出仍然是全有或全无。

您要么必须对每个任务使用池的

apply_async
方法,并在输出到达时手动跟踪输出(这将涉及按一定时间间隔进行轮询),或者以类似的方式直接使用
Process
实例。

此外,您可能必须在主线程和子进程中配置信号处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.