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.