Сначала будет выведено 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.