Python Glossary English

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Сообщить о неточности