В показанном коде после долгого ожидания печатается 1, затем возникает NameError из-за неопределённого result. Порядок 1, 3, 2 получится только после исправления return.
Понимание порядка выполнения корутин в asyncio
В показанном коде после долгого ожидания печатается 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, но сам по себе не запускает следующие строки этой же корутины параллельно.