gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:31:56 30 4
gpt4 key购买 nike

我有以下代码:

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

关于python - 使用 asyncio 时,如何让所有正在运行的任务在关闭事件循环之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27796294/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com