2016-06-20 3 views
2

ausführen Ich versuche zu verstehen, wie Sie einen asynchronen Prozess von Coroutine-Handler innerhalb aioweb Framework ausführen. Hier ist ein Beispiel für den Code ein:Wie async-Prozess von Handler in aiohttp

def process(request): 
    # this function can do some calc based on given request 
    # e.g. fetch/process some data and store it in DB 
    # but http handler don't need to wait for its completion 

async def handle(request): 
    # process request 
    process(request) ### THIS SHOULD RUN ASYNCHRONOUSLY 

    # create response 
    response_data = {'status': 'ok'} 

    # Build JSON response 
    body = json.dumps(response_data).encode('utf-8') 
    return web.Response(body=body, content_type="application/json") 

def main(): 
    loop = asyncio.get_event_loop() 
    app = web.Application(loop=loop) 
    app.router.add_route('GET', '/', handle) 

    server = loop.create_server(app.make_handler(), '127.0.0.1', 8000) 
    print("Server started at http://127.0.0.1:8000") 
    loop.run_until_complete(server) 
    try: 
     loop.run_forever() 
    except KeyboardInterrupt: 
     pass 

if __name__ == '__main__': 
    main() 

Ich möchte process Funktion asynchron vom Handler auszuführen. Kann mir jemand ein Beispiel geben, wie ich das erreichen kann? Ich bin schwer zu verstehen, wie ich die Main Event-Schleife innerhalb eines Handlers übergeben/verwenden kann und sie an eine andere Funktion weiterleite, die selbst einen asynchronen Prozess darin ausführen kann.

Antwort

3

Ich denke, Sie Ihre bestehende process Funktion als Koroutine definieren sollte (async def sollte die Arbeit erledigen Ihre Funktion als Koroutine wickeln) und asyncio.ensure_future in der Haupt handle Funktion verwenden.

async def process(request): 
    # Do your stuff without having anything to return 

async def handle(request): 
    asyncio.ensure_future(process(request)) 
    body = json.dumps({'status': 'ok'}).encode('utf-8') 
    return web.Response(body=body, content_type="application/json") 

asyncio documention Nach der ensure_future Methode sollte für ein Ergebnis, ohne zu blockieren/warten, um die Ausführung des Koroutine (die process Funktion in Ihrem Fall) plant.

Ich vermute, dass was Sie suchen, könnte im Zusammenhang mit einigen vorhandenen Beiträge wie diese stehen: "Fire and forget" python async/await

Verwandte Themen