使用asyncio时,如何在关闭事件循环之前让所有正在运行的任务完成

derderderyery

我有以下代码:

@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()]>>

如何正确安排关机时间?

为了提供一些背景信息,我正在编写一个系统监视器,该监视器每5秒从/ proc / stat中读取一次,计算该时间段内的CPU使用率,然后将结果发送到服务器。我想继续计划这些监视作业,直到收到sigterm为止,当我停止计划时,等待所有当前作业完成并正常退出。

马丁·理查德

您可以检索未完成的任务并再次运行循环,直到完成为止,然后关闭循环或退出程序。

pending = asyncio.all_tasks()
loop.run_until_complete(asyncio.gather(*pending))
  • pending 是待处理任务的列表。
  • asyncio.gather() 允许一次等待几个任务。

如果要确保在协程内部完成所有任务(也许您有一个“主”协程),则可以这样做,例如:

async def do_something_periodically():
    while True:
        asyncio.create_task(my_expensive_operation())
        await asyncio.sleep(my_interval)
        if shutdown_flag_is_set:
            print("Shutting down")
            break

    await asyncio.gather(*asyncio.all_tasks())

同样,在这种情况下,由于所有任务都是在同一协程中创建的,因此您已经可以访问这些任务:

async def do_something_periodically():
    tasks = []
    while True:
        tasks.append(asyncio.create_task(my_expensive_operation()))
        await asyncio.sleep(my_interval)
        if shutdown_flag_is_set:
            print("Shutting down")
            break

    await asyncio.gather(*tasks)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在工作人员关闭时向正在运行的任务发送消息?

来自分类Dev

如何在列出所有正在运行的进程时使用procps-3.2.8?

来自分类Dev

如何使用Tokio远程关闭正在运行的任务

来自分类Dev

如何获取当前正在运行的所有任务

来自分类Dev

在完成所有任务之前,关闭ThreadPoolExecutor

来自分类Dev

如何在Android中以编程方式关闭所有正在运行的应用程序?

来自分类Dev

使用线程处理时如何在后台关闭正在运行的CMD?

来自分类Dev

如何在不结束当前进程的情况下立即关闭所有正在运行的Jupyter Notebook?

来自分类Dev

在关闭程序之前,确认所有任务已完成

来自分类Dev

关闭正在运行的任务的ExecutorService

来自分类Dev

Android如何在按下时关闭正在运行的应用程序?

来自分类Dev

Android如何在按下时关闭正在运行的应用程序?

来自分类Dev

在Windows 7上启动时如何在运行任务之前等待网络

来自分类Dev

从Sanic函数调用引发“无法从正在运行的事件循环中调用asyncio.run()”

来自分类Dev

使用JUnit完成时如何测试正在运行的线程是否正确终止

来自分类Dev

任务正在运行完成,即使它没有完成

来自分类Dev

如何在运行脚本之前等待页面完成所有内容的加载,或者如何最好地检测主要的DOM更改

来自分类Dev

如何在运行新服务之前完成systemd服务?

来自分类Dev

如何关闭正在运行的应用程序的所有活动并在单击时重新启动新的应用程序

来自分类Dev

如何循环创建任务并等待所有任务完成

来自分类Dev

如何停止正在运行的Monitor上的LongRunning任务正在等待应用程序关闭?

来自分类Dev

在运行测试之前如何运行任务

来自分类Dev

如何在Linux上列出可执行文件的所有正在运行的实例?

来自分类Dev

使用Cocoa API时,所有代码是否都在运行循环中运行?

来自分类Dev

我如何在运行iptables bash脚本之前杀死所有已建立的连接

来自分类Dev

Sqoop:如何在运行 sqoop 导入之前获取所有表的记录计数

来自分类Dev

任务管理器显示的总CPU使用率高于所有正在运行的进程的总和。隐藏的过程?

来自分类Dev

如何改善正在运行的异步任务

来自分类Dev

如何停止正在运行的异步任务?

Related 相关文章

  1. 1

    如何在工作人员关闭时向正在运行的任务发送消息?

  2. 2

    如何在列出所有正在运行的进程时使用procps-3.2.8?

  3. 3

    如何使用Tokio远程关闭正在运行的任务

  4. 4

    如何获取当前正在运行的所有任务

  5. 5

    在完成所有任务之前,关闭ThreadPoolExecutor

  6. 6

    如何在Android中以编程方式关闭所有正在运行的应用程序?

  7. 7

    使用线程处理时如何在后台关闭正在运行的CMD?

  8. 8

    如何在不结束当前进程的情况下立即关闭所有正在运行的Jupyter Notebook?

  9. 9

    在关闭程序之前,确认所有任务已完成

  10. 10

    关闭正在运行的任务的ExecutorService

  11. 11

    Android如何在按下时关闭正在运行的应用程序?

  12. 12

    Android如何在按下时关闭正在运行的应用程序?

  13. 13

    在Windows 7上启动时如何在运行任务之前等待网络

  14. 14

    从Sanic函数调用引发“无法从正在运行的事件循环中调用asyncio.run()”

  15. 15

    使用JUnit完成时如何测试正在运行的线程是否正确终止

  16. 16

    任务正在运行完成,即使它没有完成

  17. 17

    如何在运行脚本之前等待页面完成所有内容的加载,或者如何最好地检测主要的DOM更改

  18. 18

    如何在运行新服务之前完成systemd服务?

  19. 19

    如何关闭正在运行的应用程序的所有活动并在单击时重新启动新的应用程序

  20. 20

    如何循环创建任务并等待所有任务完成

  21. 21

    如何停止正在运行的Monitor上的LongRunning任务正在等待应用程序关闭?

  22. 22

    在运行测试之前如何运行任务

  23. 23

    如何在Linux上列出可执行文件的所有正在运行的实例?

  24. 24

    使用Cocoa API时,所有代码是否都在运行循环中运行?

  25. 25

    我如何在运行iptables bash脚本之前杀死所有已建立的连接

  26. 26

    Sqoop:如何在运行 sqoop 导入之前获取所有表的记录计数

  27. 27

    任务管理器显示的总CPU使用率高于所有正在运行的进程的总和。隐藏的过程?

  28. 28

    如何改善正在运行的异步任务

  29. 29

    如何停止正在运行的异步任务?

热门标签

归档