asyncio.gather

Функция asyncio.gather используется для одновременного выполнения нескольких заданий и сбора их результатов. Она принимает несколько корутин (или задач), создаёт для каждой из них задачу, и возвращает единую задачу, которая завершится, когда все переданные ей аргументы завершатся.

Пример:

import asyncio

async def task1():
    await asyncio.sleep(1)
    return "Результат задачи 1"

async def task2():
    await asyncio.sleep(2)
    return "Результат задачи 2"

async def main():
    results = await asyncio.gather(task1(), task2())
    print(results)

asyncio.run(main())
Поскольку каждая корутина в функции gather оборачивается в задачу, выполнение каждой из корутины/задачи также начинается сразу и не блокирует выполнение основной программы (до тех пор, пока не вызван await asyncio.gather(...)).

Если любая из подзадач выбрасывает исключение, оно будет передано вызывающему коду. Можно использовать параметр return_exceptions=True для возврата исключений как результатов.

Пример с обработкой исключений:

import asyncio

async def task1():
    await asyncio.sleep(1)
    return "Результат задачи 1"

async def task_with_exception():
    await asyncio.sleep(2)
    raise ValueError("Ошибка в задаче")

async def main():
    results = await asyncio.gather(
        task1(),
        task_with_exception(),
        return_exceptions=True
    )
    for result in results:
        if isinstance(result, Exception):
            print(f"Исключение: {result}")
        else:
            print(f"Результат: {result}")

asyncio.run(main())

По сути, asyncio.gather - это версия множества вызовов asyncio.create_task с дополнительной обработкой различных ситуаций. Однако, gather не позволяет вручную управлять каждой задачей.