Python ThreadPoolExecutor подавляет исключения - PullRequest
5 голосов
/ 10 мая 2019
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED


def div_zero(x):
    print('In div_zero')
    return x / 0


with ThreadPoolExecutor(max_workers=4) as executor:
    futures = executor.submit(div_zero, 1)

    done, _ = wait([futures], return_when=ALL_COMPLETED)
    # print(done.pop().result())

    print('Done')

Программа, приведенная выше, будет работать до конца без сообщения об ошибке.

Вы можете получить исключение, только если вы явно позвоните future.result() или future.exception(), как я сделал в закомментированной строке.

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

Ответы [ 2 ]

5 голосов
/ 17 мая 2019

Я подозреваю, что причина в том, что весь пул не падает, потому что один поток вызывает исключение.Таким образом, пул будет обрабатывать все задачи, и вы можете получать потоки, которые вызвали исключения, если вам нужно.

1 голос
/ 17 мая 2019

Каждый поток (в основном) изолирован от других потоков, включая основной поток. Основной поток не связывается с другими потоками , пока вы не попросите его сделать это .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...