Ответ
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
.