Сначала пройдёт примерно 10 секунд без вывода, затем появится foo и сразу после него bar. Между этими двумя сообщениями специально заданной задержки нет.
Определение порядка вывода в асинхронном скрипте
Сначала пройдёт примерно 10 секунд без вывода, затем появится foo и сразу после него bar. Между этими двумя сообщениями специально заданной задержки нет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Проанализируйте приведённый ниже код. Укажите, в какой последовательности появятся сообщения в консоли и будет ли между ними наблюдаться пауза.
import asyncio
async def foo():
await asyncio.sleep(10)
print("foo")
async def bar():
print("bar")
async def main():
await foo()
await bar()
if __name__ == '__main__':
asyncio.run(main())
Ответ
Сначала пройдёт примерно 10 секунд без вывода, затем появится foo и сразу после него bar. Между этими двумя сообщениями специально заданной задержки нет.
main последовательно ожидает foo и bar. Внутри foo sleep отдаёт управление event loop, но main всё ещё ждёт окончания этой корутины. После сна foo печатает своё сообщение и завершается; только тогда вызывается bar.
asyncio.sleep не блокирует поток так, как time.sleep, однако сам по себе не запускает следующую корутину параллельно. Чтобы bar выполнилась во время ожидания foo, их нужно планировать как независимые задачи, например через gather. В исходнике этого нет.