如何轮询 python asyncio 任务状态
How to poll python asyncio task status
使用 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()
我该如何更改它以获得预期的行为?
您可以使用类似于 ready
的 ensure_future
(but not awaiting it). In return you'll get a Future object that have done
方法安排较长的 运行 任务
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()
使用 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()
我该如何更改它以获得预期的行为?
您可以使用类似于 ready
ensure_future
(but not awaiting it). In return you'll get a Future object that have done
方法安排较长的 运行 任务
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()