Код: Выделить всё
all_tasks = [asyncio.create_task(ds.get() for ds in data_sources]
try:
done, pending = await asyncio.await(
all_tasks,
return_when=asyncio.FIRST_COMPLETED
)
for task in done:
if (ex := task.exception()):
raise ex
response = await task
# more handling here, but let's pretend it's just...
return response
finally:
for task in pending:
try:
task.cancel()
await task
except asyncio.CancelledError:
continue
ex = task.exception()
if ex is not None:
logger.warn("task failed", ex)
for task in done:
ex = task.exception()
if ex is not None:
logger.warn("task failed", ex)
это на самом деле невыносимо? Что да, то, что нужно изменить, чтобы иметь эквивалентную функциональность без риска повреждения внутреннего состояния Асинсио? Хотите ждать только задачи первого для выполнения, и отменить других детей без пропаганды этой отмены родителю).
Подробнее здесь: https://stackoverflow.com/questions/796 ... to-swallow