Получить доступ

Чем asyncio.gather отличается от TaskGroup и как в них обрабатываются ошибки?

MiddleКонкурентностьasyncioPython >=3.11
Ещё спрашивают так:
  • Как запустить несколько корутин параллельно в asyncio?
  • Что такое ExceptionGroup и except*?
Коротко

Оба запускают корутины конкурентно. gather при первой ошибке пробрасывает её, но остальные задачи продолжают работать брошенными (если не return_exceptions=True). TaskGroup (3.11) — структурная конкурентность: ошибка в одной задаче отменяет остальные, блок ждёт завершения всех, ошибки приходят ExceptionGroup.

  • except* разбирает ExceptionGroup по типам
  • gather(return_exceptions=True) — исключения возвращаются в списке результатов
  • TaskGroup не оставляет задач-сирот после выхода из блока

А ещё Для лимита параллелизма — Semaphore поверх любого из них

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

gather:

results = await asyncio.gather(fetch(a), fetch(b), fetch(c))

Результаты — в порядке аргументов. Если fetch(b) упал, await gather бросит это исключение, но fetch(a) и fetch(c) не отменяются и продолжают работать в фоне; их ошибки могут потеряться («Task exception was never retrieved»).

С return_exceptions=True gather не бросает, а кладёт исключения в список результатов — удобно, когда нужно собрать всё, что получилось.

TaskGroup (Python 3.11):

async with asyncio.TaskGroup() as tg:
    ta = tg.create_task(fetch(a))
    tb = tg.create_task(fetch(b))
print(ta.result(), tb.result())
  • выход из блока — только когда все задачи завершены;
  • первая ошибка отменяет остальные задачи группы;
  • все ошибки собираются в ExceptionGroup.

Обработка ExceptionGroup:

try:
    async with asyncio.TaskGroup() as tg: ...
except* TimeoutError as eg:
    log.warning("таймауты: %s", eg.exceptions)
except* ValueError:
    ...

Выбор: новые проекты — TaskGroup: нет утечки задач и потерянных ошибок. gather — когда нужны частичные результаты при ошибках (return_exceptions=True) или код под Python < 3.11.

Что хотят услышать

  • Поведение gather при ошибке.
  • Структурная конкурентность TaskGroup.
  • ExceptionGroup и except*.

Частые ошибки

  • Считать, что gather отменяет остальные задачи при ошибке.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем