了解aiohttp.TCPConnector池和连接限制

时间:2018-12-28 16:18:32

标签: python python-3.x python-asyncio aiohttp

我正在对limit使用limit_per_hostaiohttp.connector.TCPConnector参数。

在下面的脚本中,我将connector = aiohttp.connector.TCPConnector(limit=25, limit_per_host=5)传递给aiohttp.ClientSession,然后打开2个对docs.aiohttp.org的请求和3个对github.com的请求。

session.request的结果是aiohttp.ClientResponse的实例,在此示例中,我故意不通过.close()或{{1}对其调用.close() }。我认为这将使连接池保持打开状态,并且到该主机(ssl,端口)的可用连接减少-1的三倍。

下表代表每次请求后的__aexit__为什么即使在完成对docs.aiohttp.org的第二次请求后,数字仍会挂在4上?这两个连接可能仍处于打开状态,并且尚未访问._available_connections()或已关闭。可用连接数不应该减少1?

._content

此外,为什么After Request Num. To _available_connections 1 docs.aiohttp.org 4 2 docs.aiohttp.org 4 <--- Why? 3 github.com 4 4 github.com 3 5 github.com 2 只包含1个密钥?我想我可能正在理解TCPConnector的方法;是什么解释了上面的行为?

完整脚本:

._acquired_per_host

输出粘贴到https://pastebin.com/rvfzMTe3。我把它放在这里而不是在这里,因为这些行很长而且不太容易包裹。

1 个答案:

答案 0 :(得分:6)

要解决您的主要问题“即使完成对docs.aiohttp.org的第二次请求,为什么数字仍挂在4上?”, 调用aiohttp.connector.BaseConnector._release()时,连接数将减少;如果您要在async with上使用session.request(),则调用连接数 或显式调用.close()或使用.read()阅读响应内容之后。或服务器发送EOF时docs.aiohttp.org请求的情况(当服务器不等待您流式传输响应内容而是将其全部发送以响应第一个请求时,会发生这种情况)。这就是这里发生的事情。在aiohttp.connector.BaseConnector._release()中放置一个断点并检查堆栈时,您可以自己看到,您将看到aiohttp.http_parser.DeflateBuffer.feed_eof()被调用。并且该aiohttp.streams.StreamReade._eof_callbacks包含正在调用aiohttp.client_reqrep.ClientResponse._response_eof()的{​​{1}}

关于第二个问题“ self._connection.release()为什么只包含1个密钥”,这很奇怪。但我在文档中看不到任何内容。这是一个私有属性,因此我们不应该将其弄乱。它可能只是命名不正确的私有属性。