Как я могу поймать, когда поток умирает в ThreadPoolExecutor ()? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть очень простой 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)

1 Ответ

1 голос
/ 09 апреля 2020

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...