asyncio.ensure_future(slow())
только планирует slow()
для запуска на следующем проходе цикла событий. Поскольку ваш цикл while
не ожидает ничего, что может фактически блокировать, вы не даете шансу события возможность работать.
Вы можете обойти эту проблему, добавив await asyncio.sleep(0)
после вызова быстрой функции:
async def main():
while True:
if need_to_run_slow:
asyncio.ensure_future(slow())
await asyncio.sleep(0)
do_fast_stuff_with(variable)
Неактивный режим сна гарантирует, что на каждой итерации цикла while
(и между запусками "быстрой" функции ") есть шанс для заранее запланированного slow()
для достижения прогресса.
Однако ваш slow()
тоже не ждет, поэтому весь его код будет выполняться за одну итерацию, что делает вышеприведенный эквивалент гораздо более простым:
def main():
while True:
slow() # slow() is an ordinary function
do_fast_stuff_with(variable)
Пример кода, более близкий к вашему реальному варианту использования, вероятно, приведет к более непосредственному использованию ответа.