【问题标题】:How to end all tasks in a ThreadPoolExecutor if one of them can throw an exception如果其中一个可以引发异常,如何结束 ThreadPoolExecutor 中的所有任务
【发布时间】:2020-11-21 18:46:59
【问题描述】:

我有一个任务要做:

def task(body):
    # some logic that which can throw an exception
    # if something goes wrong
    do_task(body) 

而且这个任务里面的逻辑可以抛出异常

我有执行器的执行方法:

def execute():
    executor = ThreadPoolExecutor(max_workers=4)
    future1 = executor.submit(task, body1)
    future2 = executor.submit(task, body2)
    future3 = executor.submit(task, body3)
    future4 = executor.submit(task, body4)
    
    result1 = future1.result()
    result2 = future2.result()
    result3 = future3.result()
    result4 = future4.result()

如果至少有一项任务崩溃,我希望 - 不要等待其他任务完成并停止一切。我怎样才能正确地做到这一点?

【问题讨论】:

    标签: python python-3.x python-multiprocessing python-multithreading


    【解决方案1】:

    要在一个加注时放弃等待其他任务,您可以使用 concurrent.futures.wait()FIRST_EXCEPTION 标志:

    def execute():
        executor = ThreadPoolExecutor(max_workers=4)
        future1 = executor.submit(task, body1)
        future2 = executor.submit(task, body2)
        future3 = executor.submit(task, body3)
        future4 = executor.submit(task, body4)
    
        done, not_done = concurrent.futures.wait(
            [future1, future2, future3, future4],
            return_when=concurrent.futures.FIRST_EXCEPTION
        )
        if not_done:
            # at least one future has raised - you can return here
            # or propagate the exception
            #list(not_done)[0].result()  # re-raises exception here
            return  # ignores exception and returns
    
        result1 = future1.result()
        result2 = future2.result()
        result3 = future3.result()
        result4 = future4.result()
        ...
    

    请注意,其余任务仍将在后台继续运行。没有办法强行阻止。

    【讨论】:

    • 如果至少有一个任务失败,是否有更好的方法来终止所有任务?或者这是不好的做法?
    • @Pikachu 在多线程 Python 中没有终止任务这样的事情。您可以礼貌地要求他们停止(您必须自己实施),和/或您可以选择不等待他们(答案显示了如何做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多