При использовании asyncio, как вы разрешаете выполнение всех задач перед закрытием цикла событий

У меня есть следующий код:

@asyncio.coroutine def do_something_periodically(): while True: asyncio.async(my_expensive_operation()) yield from asyncio.sleep(my_interval) if shutdown_flag_is_set: print("Shutting down") break 

Я запускаю эту функцию до завершения. Проблема возникает, когда выключение установлено – функция завершается, и все ожидающие задачи никогда не запускаются. (Вы видите это как ошибку

 task: <Task pending coro=<report() running at script.py:33> wait_for=<Future pending cb=[Task._wakeup()]>> 

). Как правильно запланировать выключение?

Чтобы дать некоторый контекст, я пишу системный монитор, который читает из / proc / stat каждые 5 секунд, вычисляет использование процессора в этот период и затем отправляет результат на сервер. Я хочу продолжать планировать эти задания мониторинга до тех пор, пока не получу сигтерм, когда остановлюсь на планировании, дождитесь завершения всех текущих заданий и изящного выхода.

One Solution collect form web for “При использовании asyncio, как вы разрешаете выполнение всех задач перед закрытием цикла событий”

Вы можете получить незавершенные задачи и запустить цикл еще до их завершения, затем закрыть цикл или выйти из программы.

 pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending)) 
  • Ожидается список ожидающих задач.
  • asyncio.gather () позволяет подождать сразу несколько задач.

Если вы хотите, чтобы все задачи выполнялись внутри сопрограммы (возможно, у вас есть «главная» сопрограмма), вы можете сделать это таким образом, например:

 @asyncio.coroutine def do_something_periodically(): while True: asyncio.async(my_expensive_operation()) yield from asyncio.sleep(my_interval) if shutdown_flag_is_set: print("Shutting down") break yield from asyncio.gather(*asyncio.Task.all_tasks()) 

Кроме того, в этом случае, поскольку все задачи создаются в одной сопрограмме, вы уже имеете доступ к задачам:

 @asyncio.coroutine def do_something_periodically(): tasks = [] while True: tasks.append(asyncio.async(my_expensive_operation())) yield from asyncio.sleep(my_interval) if shutdown_flag_is_set: print("Shutting down") break yield from asyncio.gather(*tasks) 
  • Python asyncio: доходность не использовалась с будущим?
  • Asyncio.gather vs asyncio.wait
  • asyncio matplotlib show () все еще замораживает программу
  • Почему я получаю разные результаты при использовании понимания списка с сопрограммами с asyncio?
  • Как правильно создавать и запускать параллельные задачи с помощью асинхронного модуля python?
  • Производительность asyncio
  • asyncio - Как можно использовать сопрограммы в обработчиках сигналов?
  • Следите за файлом с asyncio
  • Вызов сопрограммы в asyncio.Protocol.data_received
  • Ожидание выполнения задачи после KeyboardInterrupt в asyncio
  • aiohttp - исключение игнорируется сообщение
  • Python - лучший язык программирования в мире.