После долгого ожидания test_1 вернёт None и напечатает 1, затем main напечатает 3. test_2 получит None, но вызов sleep с extra вызовет TypeError: сообщения 2 не будет.
Порядок выполнения и передача аргументов в asyncio
После долгого ожидания test_1 вернёт None и напечатает 1, затем main напечатает 3. test_2 получит None, но вызов sleep с extra вызовет TypeError: сообщения 2 не будет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разобрать, в каком порядке выводятся сообщения и какие значения передаются между корутинами. Определите, какое значение будет получено в параметре data функции test_2() в приведённом примере. Проверьте, соответствует ли комментарий под кодом фактическому порядку вывода.
# asyncio / multiprocessing / threading
async def test_1():
data = await asyncio.sleep(10000000)
print('1')
return data
async def test_2(data):
await asyncio.sleep(1, extra=data)
print('2')
async def main():
data = await test_1()
print('3')
await test_2(data)
asyncio.run(main())
Ответ
После долгого ожидания test_1 вернёт None и напечатает 1, затем main напечатает 3. test_2 получит None, но вызов sleep с extra вызовет TypeError: сообщения 2 не будет.
Предполагается, что asyncio импортирован. Первый await ждёт 10 000 000 секунд; он не запускает следующие строки main параллельно. У asyncio.sleep без аргумента result результат равен None, поэтому именно None передаётся в test_2.
Аргумент extra не поддерживается. Исправление:
await asyncio.sleep(1, result=data)
После такой замены порядок будет 1, 3, 2. Без import asyncio исходный самостоятельный фрагмент завершится ещё раньше с NameError. Для конкурентного выполнения нужны отдельно созданные задачи, а не только последовательные await.