为什么aiohttp在ClientSession中弃用了loop参数?

CSM*_*CSM 8 python aiohttp

在aiohttp的doc中写道:

  • loop - 用于处理HTTP请求的事件循环.如果loop为None,则构造函数如果指定则从连接器借用它.asyncio.get_event_loop()用于获取默认事件循环.

自2.0版以来已弃用.

我用谷歌搜索,但没有得到任何关于为什么loop参数被弃用的描述.

我经常创建这样的ClientSession对象:

loop = asyncio.get_event_loop()
session = aiohttp.ClientSession(loop=loop)
Run Code Online (Sandbox Code Playgroud)

现在loop参数被删除了,但只是在aiohttp.ClientSession()没有循环的情况下调用会得到一个警告:

在协同程序之外创建客户端会话

那么为什么不推荐使用该参数以及如何正确使用会话?

Ben*_*Ben 1

这个问题在本期中得到解决,建议在协程中创建客户端会话对象,以避免难以调试的错误。此处演示了首选用法;以供参考:

async def fetch(client):
    async with client.get('http://python.org') as resp:
        assert resp.status == 200
        return await resp.text()

async def main():
    async with aiohttp.ClientSession() as client:
        html = await fetch(client)
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)

  • aoihttp 还建议对整个应用程序使用单个会话来改进连接池。我不明白如何通过这种使用模式以合理的方式做到这一点 (3认同)