Как отменить все оставшиеся задачи в сборе, если одна из них не удалась?Python

Программы на Python
Ответить
Anonymous
 Как отменить все оставшиеся задачи в сборе, если одна из них не удалась?

Сообщение Anonymous »

Если одна задача сбора вызовет исключение, остальные все равно смогут продолжить работу.
Ну, это не совсем то, что мне нужно. Я хочу различать ошибки, которые являются фатальными и требуют отмены всех оставшихся задач, и ошибки, которые не являются фатальными и вместо этого должны регистрироваться, позволяя продолжить выполнение других задач.
Вот моя неудачная попытка чтобы реализовать это:

Код: Выделить всё

from asyncio import gather, get_event_loop, sleep

class ErrorThatShouldCancelOtherTasks(Exception):
pass

async def my_sleep(secs):
await sleep(secs)
if secs == 5:
raise ErrorThatShouldCancelOtherTasks('5 is forbidden!')
print(f'Slept for {secs}secs.')

async def main():
try:
sleepers = gather(*[my_sleep(secs) for secs in [2, 5, 7]])
await sleepers
except ErrorThatShouldCancelOtherTasks:
print('Fatal error; cancelling')
sleepers.cancel()
finally:
await sleep(5)

get_event_loop().run_until_complete(main())
(наконец-то ожидание сна здесь предназначено для предотвращения немедленного закрытия интерпретатора, что само по себе приведет к отмене всех задач)
Как ни странно, вызов cancel при сборе на самом деле не отменяет его!

Код: Выделить всё

PS C:\Users\m> .\AppData\Local\Programs\Python\Python368\python.exe .\wtf.py
Slept for 2secs.
Fatal error; cancelling
Slept for 7secs.
Я очень удивлен таким поведением, поскольку оно противоречит документации, в которой говорится:

Код: Выделить всё

asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)
Вернуть будущее, агрегирующее результаты из заданных объектов или фьючерсов сопрограммы.
(...)
Отмена: если внешнее будущее отменяется, все дочерние элементы (которые еще не завершились) также отменяются. (...)

Что мне здесь не хватает? Как отменить оставшиеся задачи?

Подробнее здесь: https://stackoverflow.com/questions/590 ... -one-fails
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»