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

derekdreery:

我有以下代码:

@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为止,当我停止计划时,等待所有当前作业完成,然后正常退出。

马丁·理查德(Martin Richard):

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

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 条评论
登录 后参与评论

相关文章

JavaFX-如何在退出应用程序之前关闭所有正在运行的线程?

如何在终止事件循环之前等待所有任务完成?

Asyncio 与 ProcessPoolExecutor 在完成所有任务之前关闭

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

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

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

Python Asyncio-RuntimeError:无法关闭正在运行的事件循环

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

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

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

如何修复运行时错误:无法关闭正在运行的事件循环-Python Discord Bot

asyncio:仅在所有其他任务正在等待时才运行任务

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

使用asyncio.run()时,Asyncio事件循环关闭

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

Django 频道从 Celery 任务发送组消息。异步事件循环在所有异步任务完成之前停止

如果事件循环已经在运行,如何在方法中等待协程同步完成?

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

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

Python asyncio事件循环。完成异步任务后永远运行循环

如何在Dask中停止正在运行的任务?

无法从正在运行的事件循环中调用asyncio.run()

RuntimeError:无法从正在运行的事件循环中调用asyncio.run()

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

Python asyncio有两项任务,只有一项正在运行

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

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

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

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