Sobes.tech
Junior — Middle
83

Какое отличие между TaskGroup и функцией gather в библиотеке asyncio в Python?

Answer from AI

sobes.tech AI

В asyncio Python gather и TaskGroup служат для управления несколькими асинхронными задачами, но имеют важные отличия:

  • asyncio.gather запускает несколько корутин параллельно и собирает их результаты. Если одна из задач вызывает исключение, по умолчанию остальные продолжают выполняться, а исключение пробрасывается после завершения всех.

  • asyncio.TaskGroup (добавлен в Python 3.11) обеспечивает более структурированное управление задачами. Все задачи внутри TaskGroup отменяются, если одна из них завершилась с ошибкой, что предотвращает «зависание» задач. TaskGroup гарантирует, что все задачи завершатся до выхода из контекста.

Пример с gather:

results = await asyncio.gather(coro1(), coro2(), return_exceptions=False)

Пример с TaskGroup:

async with asyncio.TaskGroup() as tg:
    tg.create_task(coro1())
    tg.create_task(coro2())
# Если coro1 или coro2 вызовет исключение, остальные задачи отменятся

Итого, TaskGroup обеспечивает более безопасное и структурированное управление группой задач, особенно при обработке ошибок.