Почему Pythons ThreadPoolExecutor подавляет все исключения и как это исправить? - PullRequest
0 голосов
/ 08 ноября 2019

Я относительно новичок в Python, так что если это простой вопрос, извините за это, но я не понимаю поведение этого пула. Я также рассмотрел похожие вопросы на этой платформе, но все еще не понял этого.

Например, если у нас есть простое использование Исполнителя:

with ThreadPoolExecutor(8) as pool:
    pool.map(doSomething,test_list)

все ошибки, которыеВстречаются в бассейне, подавляются и не отображаются. Можно ли указать какой-либо параметр, чтобы пул прекращал выполнение и отображал исключения?

Заранее спасибо

1 Ответ

0 голосов
/ 08 ноября 2019

Я нашел для себя возможность, которая может косвенно обойти эту проблему. Это на самом деле довольно просто, поэтому я хотел бы опубликовать это здесь, если кто-то еще сталкивается с этой проблемой. Я не знаю, очень ли это умно, но для меня это решение было хорошо.

Сначала благодаря @artiom, как он уже сказал, лучше всего ловить ошибку непосредственно в распараллеленной функции.

Теперь "обход":

Поместите попытку, кроме блока, внутри функции вокруг всего кода и перехватывайте все исключения с помощью

except Exception as e:

. Исключение просто регистрируется в блоке исключения, например, с помощью часового или другого каркаса ведения журнала. При этом вы можете, по крайней мере, снова взглянуть на выброшенные исключения и исправить свои ошибки в своем коде.

Простой пример:

def for_parallel(chunk):
    for one in chunk:
        try:
            a = 1
            foo(one['bla'])
            doSomething(one['blu'])
        except Exception as e:
            sentry.capture_exception(e)


def main():
    with ThreadPoolExecutor(8) as pool:
        pool.map(for_parallel, my_list)
...