#python #python-3.x #python-multiprocessing #python-multithreading
#python #python-3.x #python-многопроцессорная обработка #python-многопоточность
Вопрос:
У меня есть одна задача, которую я хочу выполнить:
def task(body):
# some logic that which can throw an exception
# if something goes wrong
do_task(body)
и логика внутри этой задачи может выдать исключение
И у меня есть метод execute с executor:
def execute():
executor = ThreadPoolExecutor(max_workers=4)
future1 = executor.submit(task, body1)
future2 = executor.submit(task, body2)
future3 = executor.submit(task, body3)
future4 = executor.submit(task, body4)
result1 = future1.result()
result2 = future2.result()
result3 = future3.result()
result4 = future4.result()
И я хочу, если хотя бы одна задача вылетит — не ждать завершения других задач и все остановил. Как я могу сделать это правильно?
Ответ №1:
Чтобы отказаться от ожидания других задач при возникновении одной из них, вы можете использовать concurrent.futures.wait()
с FIRST_EXCEPTION
флагом:
def execute():
executor = ThreadPoolExecutor(max_workers=4)
future1 = executor.submit(task, body1)
future2 = executor.submit(task, body2)
future3 = executor.submit(task, body3)
future4 = executor.submit(task, body4)
done, not_done = concurrent.futures.wait(
[future1, future2, future3, future4],
return_when=concurrent.futures.FIRST_EXCEPTION
)
if not_done:
# at least one future has raised - you can return here
# or propagate the exception
#list(not_done)[0].result() # re-raises exception here
return # ignores exception and returns
result1 = future1.result()
result2 = future2.result()
result3 = future3.result()
result4 = future4.result()
...
Обратите внимание, что остальные задачи все равно будут выполняться в фоновом режиме. Нет способа остановить их принудительно.
Комментарии:
1. Есть ли лучший способ завершить все задачи, если хотя бы одна из них завершится неудачей? Или это плохая практика?
2. @Pikachu В многопоточном Python нет такого понятия, как завершение задач. Вы можете вежливо попросить их остановиться (что вы должны реализовать самостоятельно) и / или вы можете не ждать их (что показано в ответе, как это сделать).