立即在 concurrent.futures 中引发异常

Immediately raise exceptions in concurrent.futures

我 运行 多个线程并发使用 concurrent.futures。所有这些都是 运行 成功才能使代码中的后续步骤成功所必需的。

虽然在所有进程结束时我可以通过 运行ning .result() 引发任何异常,但理想情况下在单个线程中引发的任何异常都会立即停止所有线程。这将有助于更快地识别任何任务中的错误,而不是等到所有 long-运行ning 进程完成。

这可能吗?

有可能在第一次异常后退出并且不向执行器提交任何新作业。但是,作业一旦提交就无法取消,您必须等待所有提交的作业完成(或超时)。参见 this question for details. Here's a short example that cancels any unsubmitted jobs once the first exception occurs. However, it still waits for the already submitted jobs to finish. This uses the "FIRST EXCEPTION" keyword listed in the concurrent.futures docs

import time
import concurrent.futures

def example(i):
    print(i)
    assert i != 1
    time.sleep(i)
    return i

if __name__ == "__main__":
    futures = []
    with concurrent.futures.ThreadPoolExecutor() as executor:
        for number in range(5):
            futures.append(executor.submit(example, number))

        exception = False
        for completed, running_or_error in concurrent.futures.wait(futures, return_when="FIRST_EXCEPTION"):
            try:
                 running_or_error.result()
            except Exception as e:
                for future in futures:
                    print(future.cancel()) # cancel all unstarted futures
                raise e