2017-07-20 6 views
2

Mit GEVENT, kann ich eine Funktion mit langer Laufzeit überwachen, wie so:Wie abzufragen Python asyncio Aufgabenstatus

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) 

Wie würde ich dies mit asyncio? Ich habe Folgendes versucht, aber ich stecke fest:

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

Wie würde ich dies ändern, um das beabsichtigte Verhalten zu erhalten?

Antwort

3

Sie können die lang andauernde Aufgabe mit ensure_future planen (aber nicht warten). Im Gegenzug erhalten Sie ein Future Objekt erhalten, die done Methode, die zu 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() 
ähnlich ist