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 не позволяет вручную управлять каждой задачей.