При использовании 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) 
  • В чем разница между loop.create_task, asyncio.async / secure_future и Task?
  • Python 3 asyncio - выход из использования стека vs asyncio.async
  • Передача цикла asyncio по аргументу или использование цикла asyncio по умолчанию
  • Установка дескриптора в python3.5 асинхронно
  • Python asyncio, фьючерсы и доходность
  • Отправлять задачи asyncio в цикл в другом потоке
  • Как я могу уступить другому запросу при использовании пушки с асинчио?
  • Python asyncio: доходность не использовалась с будущим?
  • Python - лучший язык программирования в мире.