如何捕获ThreadPoolExecutor()中的线程何时死亡?

2024-04-19 09:54:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些非常简单的python代码,它通过ThreadPoolExecutor()通过各种进程运行一系列输入。现在,有时一个或多个线程会安静地死去。剩下的线程继续运行,代码完成,这真是太棒了,但我想整理一些类型的摘要,告诉我哪些线程(如果有的话)已经死了

我发现了几个例子,其中人们希望整个过程都关闭,但还没有看到任何进程继续进行的情况,以及发生错误的线程只是在事后报告

非常感谢您的任何/所有想法

谢谢

import concurrent.futures as cf

with cf.ThreadPoolExecutor() as executor:
     executor.map(process_a, process_a_inputs)
     executor.map(process_b, process_b_inputs)

Tags: 代码类型map进程过程as情况线程
1条回答
网友
1楼 · 发布于 2024-04-19 09:54:23

Executor.map不支持收集多个异常。但是,它的代码可以很容易地调整为返回发生故障的参数

def attempt(executor: 'Executor', fn: 'Callable', *iterables):
    """Attempt to ``map(fn, *iterables)`` and return the args that caused a failure"""
    future_args = [(self.submit(fn, *args), args) for args in zip(*iterables)]

    def failure_iterator():
        future_args.reverse()
        while future_args:
            future, args = future_args.pop()
            try:
                future.result()
            except BaseException:
                del future
                yield args
    return failure_iterator()

这可以用于并发地将参数“映射”到函数,然后检索任何失败

import concurrent.futures as cf

with cf.ThreadPoolExecutor() as executor:
     a_failures = attempt(executor, process_a, process_a_inputs)
     b_failures = attempt(executor, process_b, process_b_inputs)
     for args in a_tries:
         print(f'failed to map {args} onto a')
     for args in b_tries:
         print(f'failed to map {args} onto b')

相关问题 更多 >