Python 3.11+Асинхронное программированиепонятие
asyncio.TaskGroup
задачи
Асинхронный контекстный менеджер для группы задач: блок async with не завершится, пока не закончатся все задачи, а сбой одной отменяет остальные.
Синтаксис
async with asyncio.TaskGroup() as tg: task = tg.create_task(coro)
В отличие от asyncio.gather(), после первой ошибки соседние задачи не продолжают работать в фоне, а отменяются; наружу выходит не само исключение, а ExceptionGroup со всеми ошибками, поэтому ловят его через except*, а обычный except ValueError не сработает. Результаты берут из сохранённых задач (task.result()) после выхода из блока. Добавлять задачи в уже закрытую группу нельзя — RuntimeError.
Примеры
import asyncio
async def square(n):
await asyncio.sleep(0.01)
return n * n
async def main():
async with asyncio.TaskGroup() as tg:
tasks = [tg.create_task(square(n)) for n in (2, 3, 4)]
print([t.result() for t in tasks]) # → [4, 9, 16]
asyncio.run(main())
import asyncio
async def bad():
await asyncio.sleep(0.01)
raise ValueError('сбой')
async def slow():
try:
await asyncio.sleep(10)
except asyncio.CancelledError:
print('slow отменена') # → slow отменена
raise
async def main():
try:
async with asyncio.TaskGroup() as tg:
tg.create_task(bad())
tg.create_task(slow())
except* ValueError as eg:
print(type(eg).__name__, eg.exceptions) # → ExceptionGroup (ValueError('сбой'),)
asyncio.run(main())
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности