Передайте корутины в asyncio.gather или создайте задачи до ожидания. Простое присваивание coro(...) создаёт объект корутины, но не запускает его; последовательные await дают около 6 секунд.
Как преобразовать последовательные корутины в параллельные?
Передайте корутины в asyncio.gather или создайте задачи до ожидания. Простое присваивание coro(...) создаёт объект корутины, но не запускает его; последовательные await дают около 6 секунд.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Что требуется изменить в данном фрагменте, чтобы корутины выполнялись одновременно, а не последовательно? Пример кода с асинхронными функциями, вызываемыми один за другим.
import asyncio
async def coro(sleep_time):
print(f"Sleeping for {sleep_time} seconds")
await asyncio.sleep(sleep_time)
print(f"Done sleeping for {sleep_time} seconds")
async def main():
task1 = coro(1)
task2 = coro(2)
task3 = coro(3)
await task1
await task2
await task3
asyncio.run(main())
Ответ
Передайте корутины в asyncio.gather или создайте задачи до ожидания. Простое присваивание coro(...) создаёт объект корутины, но не запускает его; последовательные await дают около 6 секунд.
Минимальная замена main:
async def main():
await asyncio.gather(coro(1), coro(2), coro(3))
Все три сна перекрываются по времени, поэтому суммарное ожидание будет около 3 секунд, а завершения — примерно через 1, 2 и 3 секунды. Это конкурентное выполнение в одном event loop, не параллельные CPU-потоки. Для структурированного управления отменой и ошибками в Python 3.11+ можно выбрать TaskGroup.