Back to questions
Middle
5
Когда использовать asyncio.gather, а когда TaskGroup? Плюсы и минусы каждого.
Companies where asked
aic
Answer from AI
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())