asyncio.gather() для одновременного запуска нескольких сопрограмм (coroutine). Он принимает список сопрограмм в качестве аргументов и возвращает одну сопрограмму, которая ждет завершения всех переданных сопрограмм. Результаты возвращаются в виде списка, в том же порядке, в котором были переданы задачи. В случае возникновения исключения в одной из задач, оно будет выброшено, если явно не обработано внутри сопрограммы. Можно использовать return_exceptions=True, чтобы собрать результаты всех задач, включая исключения.
Для управления несколькими асинхронными задачами с помощью asyncio.gather(), необходимо выполнить следующие шаги:
async. Например:
async def task_one():
print("Task one started")
await asyncio.sleep(2)
print("Task one finished")
return "Result from task one"
async def task_two():
print("Task two started")
await asyncio.sleep(1)
print("Task two finished")
return "Result from task two"
asyncio.gather() для запуска корутин: Функция asyncio.gather() принимает одну или несколько корутин в качестве аргументов и планирует их выполнение. Она возвращает корутину, которая завершится, когда все переданные корутины завершатся. Результаты каждой корутины будут возвращены в виде списка, в том же порядке, в котором корутины были переданы в asyncio.gather().
async def main():
results = await asyncio.gather(
task_one(),
task_two()
)
print("All tasks completed")
print("Results:", results) # ['Result from task one', 'Result from task two']
asyncio.gather() вы можете обработать результаты, полученные от каждой асинхронной задачи. В примере выше, результаты помещаются в список `results`.asyncio.run().
asyncio.run(main())
Пример полного кода:
import asyncio
async def task_one():
print("Task one started")
await asyncio.sleep(2)
print("Task one finished")
return "Result from task one"
async def task_two():
print("Task two started")
await asyncio.sleep(1)
print("Task two finished")
return "Result from task two"
async def main():
results = await asyncio.gather(
task_one(),
task_two()
)
print("All tasks completed")
print("Results:", results)
asyncio.run(main())
Обработка исключений:
Если одна из задач, переданных в asyncio.gather(), вызовет исключение, по умолчанию, asyncio.gather() отменит все остальные задачи и перебросит это исключение. Чтобы избежать этого поведения и позволить другим задачам завершиться, можно передать аргумент return_exceptions=True. В этом случае, asyncio.gather() вернет список результатов, где вместо результатов задач, вызвавших исключения, будут содержаться сами исключения.
import asyncio
async def task_one():
print("Task one started")
await asyncio.sleep(2)
print("Task one finished")
return "Result from task one"
async def task_two():
print("Task two started")
await asyncio.sleep(1)
raise ValueError("Something went wrong in task two")
print("Task two finished") # This line will not be executed
return "Result from task two"
async def main():
results = await asyncio.gather(
task_one(),
task_two(),
return_exceptions=True # Crucial argument!
)
print("All tasks either completed or failed")
print("Results:", results) # ['Result from task one', ValueError('Something went wrong in task two')]
asyncio.run(main())
В этом случае важно проверить тип элементов в списке результатов, чтобы определить, вернулась ли задача успешно или вызвала исключение.
В заключение, asyncio.gather() - это мощный инструмент для параллельного выполнения нескольких асинхронных задач. Он позволяет существенно повысить производительность, особенно в задачах, связанных с ожиданием ввода-вывода, таких как сетевые запросы или чтение данных из файлов.