KirasiH
@KirasiH
Раньше было лучше

Почему await не переключает коррутины?

Я так поняла что await переключает внимание цикла event_loop с одной коррутины на следующую, но в моём случае это не работает
import asyncio

async def c():
    pass

async def a():
    print("start a")
    await c()
    print("finish a")

async def b():
    print("start b")
    await c()
    print("finish b")

async def main():
    loop.create_task(a())
    print("create task")
    loop.create_task(b())

loop = asyncio.new_event_loop()
loop.run_until_complete(main())
loop.run_forever()


выводит
create task
start a
finish a
start b
finish b


но я ожидаю вывод
create task
start a
start b
finish a
finish b
  • Вопрос задан
  • 119 просмотров
Решения вопроса 3
@deliro
Агрессивное программирование
в def c сделай await asyncio.sleep(0.1). Иначе ты просто напарываешься на конечный автомат ивентлупа. И там как раз всё логично и вывод правильный.

Более того, правильно запускать asyncio.run(main()) и явное использование loop — deprecated
Ответ написан
shurshur
@shurshur
asyncio вообще никак не гарантирует порядок, в котором будут выполняться функции и выполняться переключение на следующую. В этом примере, например, будет запущена a() и ничего про запуск b() не будет ещё известно среде выполнения. Затем будет запущена c(), быстро завершится и завершит a().

Смысла в таком тесте мало - тут всё очень быстро происходит. Я бы рекомендовал для экспериментов вставить asyncio.sleep в функцию c, чтобы она не завершилась так уж быстро, а также во время этого ожидания гарантировано выбралась бы следующая задача - в данном случае продолжилось выполнение main().
Ответ написан
@baynic
Переключение происходит тогда, когда происходит событие, требующее ожидание. В функции c() замените pass на await asyncio.sleep(1)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы