我正在测试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只是一个便捷的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())

关于python aiohttp进入现有事件循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53465862/

10-13 03:07