python aiohttp进入现有事件循环

时间:2018-11-25 08:33:45

标签: python python-asyncio aiohttp

我正在测试aiohttp和asyncio。我希望同一事件循环具有套接字,http服务器,http客户端。

我正在使用以下示例代码:

@routes.get('/')
async def hello(request):
    return web.Response(text="Hello, world")

app = web.Application()
app.add_routes(routes)
web.run_app(app)

问题是run_app被阻止。我想将http服务器添加到使用以下命令创建的现有事件循环中:

asyncio.get_event_loop()

2 个答案:

答案 0 :(得分:4)

  

问题是run_app被阻止。我想将http服务器添加到现有事件循环中

run_app只是一个便捷的API。要陷入现有的事件循环,可以直接实例化AppRunner

loop = asyncio.get_event_loop()
# add stuff to the loop
...

# set up aiohttp - like run_app, but non-blocking
runner = aiohttp.web.AppRunner(app)
loop.run_until_complete(runner.setup())
site = aiohttp.web.TCPSite(runner)    
loop.run_until_complete(site.start())

# add more stuff to the loop
...

loop.run_forever()

答案 1 :(得分:1)

对于Google的未来旅行者来说,这是一种更简单的方法。

async def main():
    await aio.gather(
        web._run_app(app, port=args.port),
        SomeotherTask(),
        AndAnotherTask()
    )

aio.run(main())

说明: web.runapp是内部函数web._runapp的精简包装。该函数使用旧式的方法来获取事件循环,然后调用loop.run_until_complete

我们将aio.gather替换为我们要同时运行的其他任务,并使用aio.run对其进行调度

Source