Понимание порядка выполнения корутин в asyncio

В показанном коде после долгого ожидания печатается 1, затем возникает NameError из-за неопределённого result. Порядок 1, 3, 2 получится только после исправления return.

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

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

В показанном коде после долгого ожидания печатается 1, затем возникает NameError из-за неопределённого result. Порядок 1, 3, 2 получится только после исправления return.

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

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

Условие

Разберите, в каком порядке печатаются сообщения. Объясните, почему при запуске приведённого ниже скрипта вывод будет именно: 1, 3, 2.

import asyncio

async def task_one():
    await asyncio.sleep(10000000)
    print('1')
    return result

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

async def run_all():
    await task_one()
    print('3')
    await task_two()

asyncio.run(run_all())

Обратите внимание, как await блокирует дальнейшее выполнение текущей корутины до завершения вызываемой, но не останавливает работу всего цикла событий. Это и определяет порядок появления строк в консоли.

Ответ

В показанном коде после долгого ожидания печатается 1, затем возникает NameError из-за неопределённого result. Порядок 1, 3, 2 получится только после исправления return.

await asyncio.sleep(10000000) означает ожидание примерно 116 суток. После него task_one печатает 1 и пытается выполнить return result, но переменная result в фрагменте не задана. Исключение прерывает run_all, поэтому 3 и 2 не выводятся.

Если заменить эту строку на return None, выполнение будет последовательным: завершение task_one, печать 3, затем секундное ожидание и печать 2. await приостанавливает текущую корутину, не блокируя весь event loop, но сам по себе не запускает следующие строки этой же корутины параллельно.

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

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

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

Подробнее