gpt4 book ai didi

python - 如何轮询 python asyncio 任务状态

转载 作者:行者123 更新时间:2023-11-28 21:40:50 27 4
gpt4 key购买 nike

使用 gevent,我可以像这样监控长时间运行的函数:

    greenlet = gevent.Greenlet(long_running_task, *args, **kwargs)
greenlet.start()
while not greenlet.ready():
send_heartbeat()
gevent.sleep(heartbeat_interval)
if greenlet.successful():
send_success(greenlet.value)
else:
send_failure(exception=greenlet.exception)

我将如何使用 asyncio 执行此操作?我尝试了以下但我卡住了:

    loop = asyncio.get_event_loop()
async def send_heartbeat(heartbeat_interval=15):
send_heartbeat()
asyncio.sleep(heartbeat_interval)

await asyncio.sleep(1)
loop.run_until_complete(asyncio.wait([long_running_task(*args, **kwargs), send_heartbeat()]))
loop.close()

我应该如何更改它以获得预期的行为?

最佳答案

您可以使用 ensure_future 安排长时间运行的任务(但不等待)。作为返回,你会得到一个 Future具有 done 的对象类似于ready

的方法
async def some_job():
future = asyncio.ensure_future(long_running_task(*args, **kwargs))
while not future.done():
await send_heartbeat(heartbeat_interval=15)

try:
result = future.result()
except asyncio.CancelledError:
# the task has been cancelled
except Exception:
# some exception was raised in long running task

loop = asyncio.get_event_loop()
loop.run_until_complete(some_job())
loop.close()

关于python - 如何轮询 python asyncio 任务状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45226289/

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