Как преобразовать последовательные корутины в параллельные?

Передайте корутины в 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее