繁体   English   中英

python aiohttp 进入现有的事件循环

[英]python aiohttp into existing event loop

我正在测试 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()

问题是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()

在 asyncio 3.8 及更高版本中,您可以使用asyncio.run()

async def main():
    # add stuff to the loop, e.g. using asyncio.create_task()
    ...

    runner = aiohttp.web.AppRunner(app)
    await runner.setup()
    site = aiohttp.web.TCPSite(runner)    
    await site.start()

    # add more stuff to the loop, if needed
    ...

    # wait forever
    await asyncio.Event().wait()

asyncio.run(main())

对于来自 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 ,然后调用loop.run_until_complete

我们将其替换为aio.gather以及我们想要并发运行的其他任务,并使用aio.run来安排它们

来源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM