7

我试图了解如何从 aioweb 框架内的协程处理程序运行异步进程。这是一个代码示例:

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

我想process从处理程序异步运行函数。有人可以提供一个我如何实现这一目标的例子。我很难理解如何在处理程序中传递/使用主事件循环并将其传递给另一个函数,该函数本身可以在其中运行异步进程。

4

1 回答 1

6

我想您应该将现有process函数定义为协程(async def应该将您的函数包装为协程)并asyncio.ensure_future在您的主handle函数中使用。

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 文档,该ensure_future方法应安排协程(process在您的情况下为函数)的执行,而不会阻塞/等待结果。

我猜你正在寻找的可能与一些现有的帖子有关:“Fire and forget” python async/await

于 2016-06-20T22:07:07.097 回答