Что делает и для чего используется asyncio.gather в Python

Ответ

asyncio.gather() — это функция, которая позволяет запускать несколько асинхронных операций (корутин или Future) конкурентно и агрегировать их результаты.

Основная задача — выполнить группу независимых асинхронных задач параллельно, а не последовательно, и дождаться завершения всех из них. Это значительно сокращает общее время выполнения.

Ключевые особенности:

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

Пример:

import asyncio
import time

async def task(name, delay):
    print(f"Задача {name} началась, ждет {delay} сек.")
    await asyncio.sleep(delay)
    print(f"Задача {name} завершена.")
    return f"Результат от {name}"

async def main():
    start_time = time.time()

    # Задачи будут выполняться параллельно
    results = await asyncio.gather(
        task("A", 2),
        task("B", 1)
    )

    end_time = time.time()
    print(f"Результаты: {results}") # ['Результат от A', 'Результат от B']
    # Общее время ~2 секунды, а не 3 (2+1)
    print(f"Общее время выполнения: {end_time - start_time:.2f} сек.")

asyncio.run(main())

Обработка исключений Если в одной из задач возникает исключение, gather по умолчанию немедленно пробрасывает его, отменяя остальные задачи. Чтобы собрать все результаты, включая исключения, используется флаг return_exceptions=True.