При наличии import asyncio порядок будет 1, 3, 2. main-подобная run_all ждёт завершения coroutine_a, затем печатает 3 и только после этого запускает coroutine_b.
Порядок вывода чисел в asyncio‑корутине
При наличии import asyncio порядок будет 1, 3, 2. main-подобная run_all ждёт завершения coroutine_a, затем печатает 3 и только после этого запускает coroutine_b.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, в каком порядке появятся цифры в консоли при запуске следующего Python‑кода.
# asyncio / multiprocessing / threading
async def coroutine_a():
await asyncio.sleep(1000000)
print('1')
async def coroutine_b():
await asyncio.sleep(1)
print('2')
async def run_all():
await coroutine_a()
print('3')
await coroutine_b()
asyncio.run(run_all())
Ответ
При наличии import asyncio порядок будет 1, 3, 2. main-подобная run_all ждёт завершения coroutine_a, затем печатает 3 и только после этого запускает coroutine_b.
Первый sleep длится 1 000 000 секунд, поэтому до вывода 1 проходит очень много времени. После его окончания coroutine_a печатает 1 и возвращает управление run_all. Та печатает 3 и ожидает coroutine_b, которая через секунду выводит 2.
Последовательные await не создают конкурентность между этими корутинами. Для параллельного ожидания потребовались бы create_task/gather или TaskGroup. Если запустить ровно фрагмент без импорта asyncio и без ранее определённого имени, вместо этого возникнет NameError.