Sobes.tech
Назад к вопросам
Middle
4

Когда использовать asyncio.gather, а когда TaskGroup? Плюсы и минусы каждого.

Компании, где спрашивали
aic

Ответ от нейросети

sobes.tech AI

asyncio.gather и asyncio.TaskGroup оба используются для запуска нескольких корутин параллельно, но имеют разные сценарии и особенности.

asyncio.gather:

  • Запускает несколько корутин и собирает их результаты.
  • Если одна из корутин вызывает исключение, gather по умолчанию прерывает остальные и выбрасывает исключение.
  • Можно использовать с параметром return_exceptions=True, чтобы собрать все исключения как результаты.
  • Подходит, когда нужно получить результаты всех задач и обработать их вместе.

asyncio.TaskGroup (Python 3.11+):

  • Контекстный менеджер для группировки задач.
  • Позволяет создавать задачи внутри блока, автоматически ожидает их завершения.
  • При исключении одной задачи отменяет остальные.
  • Более удобен для структурирования кода и управления жизненным циклом задач.

Плюсы и минусы:

Особенность asyncio.gather asyncio.TaskGroup
Версия Python 3.7+ 3.11+
Управление задачами Явное создание и сбор Автоматическое управление
Обработка исключений Можно собрать все исключения При исключении отменяет все
Читаемость кода Меньше структурированности Более структурированный код

Когда использовать:

  • Если нужна совместимость с версиями Python ниже 3.11 — asyncio.gather.
  • Если важна структурированность и автоматическое управление задачами — TaskGroup.

Пример с TaskGroup:

import asyncio

async def worker(n):
    await asyncio.sleep(n)
    return n

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(worker(1))
        tg.create_task(worker(2))
    print("Все задачи завершены")

asyncio.run(main())