Ну, это не совсем то, что мне нужно. Я хочу различать ошибки, которые являются фатальными и требуют отмены всех оставшихся задач, и ошибки, которые не являются фатальными и вместо этого должны регистрироваться, позволяя продолжить выполнение других задач.
Вот моя неудачная попытка чтобы реализовать это:
Код: Выделить всё
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
Мобильная версия