Порядок печати при последовательных await в asyncio

При импортированном asyncio порядок будет 1, 3, 2. Последовательные await не запускают test_1 и test_2 одновременно.

Короткий ответ

Что ответить на собеседовании

При импортированном asyncio порядок будет 1, 3, 2. Последовательные await не запускают test_1 и test_2 одновременно.

Подробный разбор

Ответ с пояснениями

Условие

Определите, в каком порядке будут выведены числа при запуске следующего скрипта.

# asyncio / multiprocessing / threading

async def test_1():
    await asyncio.sleep(1000000)
    print('1')

async def test_2():
    await asyncio.sleep(1)
    print('2')

async def main():
    await test_1()
    print('3')
    await test_2()

asyncio.run(main())

Ответ

При импортированном asyncio порядок будет 1, 3, 2. Последовательные await не запускают test_1 и test_2 одновременно.

Сначала main ждёт завершения test_1. Задержка 1000000 измеряется в секундах — примерно 11,6 суток. После неё выводится 1, затем управление возвращается в main, где печатается 3. Далее начинается test_2, которая ждёт секунду и печатает 2.

1
3
2

В показанном фрагменте отсутствует import asyncio; без него буквальный запуск завершится NameError раньше выполнения корутин. await отдаёт управление циклу событий, но продолжение текущей функции всё равно ждёт результата. Для конкурентного запуска нужны задачи или gather.

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

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

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

Подробнее