Параллельный запуск задач с разной задержкой

Сначала будет выведено bar, затем примерно через 10 секунд — foo. asyncio.gather запускает обе корутины конкурентно и ждёт завершения обеих.

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

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

Сначала будет выведено bar, затем примерно через 10 секунд — foo. asyncio.gather запускает обе корутины конкурентно и ждёт завершения обеих.

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

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

Условие

Ситуация: одна coroutine задерживается, другая выводит результат сразу. Требуется указать, в каком порядке появятся сообщения при одновременном запуске:

import asyncio

async def delayed_task():
    await asyncio.sleep(10)
    print("foo")

async def instant_task():
    print("bar")

async def run_all():
    await asyncio.gather(delayed_task(), instant_task())

asyncio.run(run_all())

Ответ

Сначала будет выведено bar, затем примерно через 10 секунд — foo. asyncio.gather запускает обе корутины конкурентно и ждёт завершения обеих.

delayed_task достигает await asyncio.sleep(10) и отдаёт управление циклу событий. Во время ожидания выполняется instant_task, которая сразу печатает bar. После истечения задержки первая задача продолжает работу и печатает foo.

bar
foo

Задержка не означает блокировку всего потока, в отличие от time.sleep внутри async-функции. Фактическое время до foo может быть немного больше 10 секунд из-за планирования. Если бы вместо gather стояли два последовательных await, вначале пришлось бы дождаться foo, а затем вывелось бы bar.

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

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

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

Подробнее