【问题标题】:How to poll python asyncio task status如何轮询python asyncio任务状态
【发布时间】:2017-07-20 22:38:00
【问题描述】:

使用 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()

我将如何改变它以获得预期的行为?

【问题讨论】:

    标签: python python-asyncio gevent


    【解决方案1】:

    您可以使用ensure_future 安排长时间运行的任务(但不等待它)。作为回报,您将获得一个 Future 对象,该对象具有类似于 readydone 方法

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多