了解 aiohttp.TCPConnector 池和连接限制

2024-01-16

我正在尝试limit and limit_per_host参数为aiohttp.connector.TCPConnector.

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

的结果session.request是一个实例aiohttp.ClientResponse,在这个例子中我故意不调用.close()在其上,或者通过.close() or __aexit__。我假设这将使连接池保持打开状态,并将到该(主机、ssl、端口)的可用连接减少三倍-1。

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

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

此外,为什么._acquired_per_host只包含 1 个密钥?我想我可能正在理解的方法TCPConnector https://github.com/aio-libs/aiohttp/blob/master/aiohttp/connector.py;如何解释上述行为?

完整脚本:

import aiohttp


async def main():
    connector = aiohttp.connector.TCPConnector(limit=25, limit_per_host=5)

    print("Connector arguments:")
    print("_limit:", connector._limit)
    print("_limit_per_host:", connector._limit_per_host)
    print("-" * 70, end="\n\n")

    async with aiohttp.client.ClientSession(
        connector=connector,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36"},
        raise_for_status=True
    ) as session:

        # Make 2 connections to docs.aiohttp.org and 
        #      3 connections to github.com
        #
        # Note that these instances intentionally do not use
        # .close(), either explicitly or via __aexit__
        # in an async with block

        r1 = await session.request(
            "GET",
            "https://docs.aiohttp.org/en/stable/client_reference.html#connectors"
        )
        print_connector_attrs("r1", session)

        r2 = await session.request(
            "GET",
            "https://docs.aiohttp.org/en/stable/index.html"
        )
        print_connector_attrs("r2", session)

        r3 = await session.request(
            "GET",
            "https://github.com/aio-libs/aiohttp/blob/master/aiohttp/client.py"
        )
        print_connector_attrs("r3", session)

        r4 = await session.request(
            "GET",
            "https://github.com/python/cpython/blob/3.7/Lib/typing.py"
        )
        print_connector_attrs("r4", session)

        r5 = await session.request(
            "GET",
            "https://github.com/aio-libs/aiohttp"
        )
        print_connector_attrs("r5", session)


def print_connector_attrs(name: str, session: aiohttp.client.ClientSession):
    print("Connection attributes for", name, end="\n\n")
    conn = session._connector
    print("_conns:", conn._conns, end="\n\n")
    print("_acquired:", conn._acquired, end="\n\n")
    print("_acquired_per_host:", conn._acquired_per_host, end="\n\n")
    print("_available_connections:")
    for k in conn._acquired_per_host:
        print("\t", k, conn._available_connections(k))
    print("-" * 70, end="\n\n")


if __name__ == "__main__":
    import asyncio
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

输出粘贴在https://pastebin.com/rvfzMTe3 https://pastebin.com/rvfzMTe3。我把它放在那里而不是放在这里,因为线条很长而且不太容易折叠。


为了解决您的主要问题“为什么即使在完成对 docs.aiohttp.org 的第二次请求后,数字仍停留在 4?”, 连接数将会减少,当aiohttp.connector.BaseConnector._release()被调用,如果您要使用async with on session.request()或显式调用.close()或者在您阅读回复内容后.read()。或者,就像 docs.aiohttp.org 请求的情况一样,当服务器发送 EOF 时(当服务器不等待您流式传输响应内容而是将其全部发送以响应第一个请求时,就会发生这种情况)。这就是这里正在发生的事情。当您在其中放置断点时,您可以亲自查看aiohttp.connector.BaseConnector._release()并检查堆栈,你会看到aiohttp.http_parser.DeflateBuffer.feed_eof()叫做。然后aiohttp.streams.StreamReade._eof_callbacks包含aiohttp.client_reqrep.ClientResponse._response_eof()那是在呼唤self._connection.release()

至于你的第二个问题“为什么._acquired_per_host只包含 1 个键”,这很奇怪。但我在文档中看不到任何相关内容。这是一个私有属性,所以我们不应该弄乱它。它可能只是私有属性的命名不当。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 aiohttp.TCPConnector 池和连接限制 的相关文章

随机推荐

  • 调整 Axes3D 标签位置

    我在 matplotlib 中的轴标签与刻度标签重叠时遇到问题 我尝试通过应用转换或调用 set y 来 手动 重新定位标签 但无济于事 这是重现该问题的片段 import matplotlib matplotlib use TKAGG i
  • 如何让C语言成为上下文无关的?

    我知道C不是上下文无关语言 一个著名的例子是 int foo typedef int foo foo x 在这种情况下 词法分析器不知道是否foo第三行是一个标识符 或者typedef 我的问题是 这是唯一的原因吗 C a 上下文相关语言
  • ReportViewer 2010 无法计算表达式

    我的项目是ASP Net WebForms 4 0框架 使用ReportViewer 10 使用Local处理模式渲染本地RDLC报表 我的问题是我的报告中的许多表达式都没有计算 例如 我在报告的页脚中有一个文本框 其中包含简单的表达式 G
  • 如何从列表理解中获取多个列表作为单独的结果?

    假设我有这样的代码 def f x return 2 x x x x range 3 xlist ylist f value for value in x 我怎样才能巧妙地得到这样的结果 xlist 0 2 4 ylist 0 1 4 注意
  • 如何使用 ant 将 jar 文件包含到 Ear 文件的 lib 文件夹中?

    我有以下文件夹结构 project ear lib folder ProjectEJBClient jar META INF folder projectEJB jar My build xml包含以下行来创建 EAR 包
  • 如何使用 Knockout 3.0 取消对可观察数组的更改?

    我的数组发生了变化 我正在使用 Sanderson 最新的数组订阅方法来捕获添加 删除更改 在此订阅中 我打算捆绑并通过网络发送我的请求 如果请求因任何原因失败 我希望能够取消对集合的任何可能的更改 我已经验证该订阅在更改传播之前就已生效
  • Silverlight DependencyProperty.SetCurrentValue 等效项

    我正在寻找相当于 NET 4 的 SL4设置当前值 http msdn microsoft com en us library system windows dependencyobject setcurrentvalue aspxAPI
  • WiX - 在两个不同位置安装相同的文件

    在我的安装程序中 我有两个可选功能 它们是同一软件版本 5 和 6 的插件 他们将相同的文件 相同的名称 相同的二进制内容 安装到应用程序的 plugins 文件夹中 但我有以下错误 C Users FooBar Documents pro
  • 如何将环境变量从 docker-compose 传递到 NodeJS 项目中?

    我有一个 NodeJS 应用程序 我想要调整其大小 该应用程序由两部分组成 服务器部分 运行一个从数据库获取数据的 API 它在端口 3000 上运行 客户端部分 它从服务器部分调用 API 端点 它运行在端口 8080 上 这样 我的客户
  • 有没有办法为嵌套函数生成 pydoc? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种为嵌套函数生成文档 本例中为 pydoc 的方法 这可以用 pydoc 实现吗 用其他工
  • 使用 RegEx 可靠地解析 HTML 元素 [重复]

    这个问题在这里已经有答案了 可能的重复 使用 PHP 解析 HTML 的最佳方法 https stackoverflow com questions 3577641 best methods to parse html with php 我
  • va_list的重用

    我需要对一个进行两次 或更多 次传递va list 我有一个一定大小的缓冲区 我想用 sprintf 向其中写入一个格式化字符串 如果格式化的字符串不适合分配的空间 我想将分配的空间加倍并重复直到适合为止 作为旁注 我希望能够首先计算格式化
  • 显示享受sql的日子[重复]

    这个问题在这里已经有答案了 我的查询是我有两个表 一个称为sec users包含以下字段 pk user name days available 另一个电话solicitud包含以下字段 pk solicitud fk empleado n
  • .arff 文件与 scikit-learn 一起使用吗?

    我想用一个属性关系文件格式 http www cs waikato ac nz ml weka arff html用 scikit learn 来做一些 NLP 任务 这可能吗 如何使用 arff文件与scikit learn 我真的推荐利
  • Zeppelin 上的皮肤可以自定义吗?

    Zeppelin 上的皮肤可以自定义吗 换句话说 把齐柏林飞艇的标志换成别的东西 是的 很有可能 如您所知 Apache Zeppelin 正在孵化 是一个开源项目 因此只需 克隆它来自github com apache incubator
  • 如何检查 Android 4.0+ 中自动旋转屏幕设置是否打开/关闭

    我认为每个 Android 设备都有能力打开 关闭自动旋转功能 通常你可以在以下位置找到它settings gt display gt auto rotate on off 如何从我的应用程序中读取此设置状态 我怎样才能访问这个设置值 如果
  • 根据 Winforms/C# 中的文本量和字体大小确定标签大小

    我想知道是否有更好的方法来解决这个问题 我想调整标签的大小 垂直 以容纳一定数量的文本 我的标签具有固定宽度 在必须换行之前大约 60 个字符宽 大约 495 像素 字体也是固定大小 据我所知是 12 点 但文本不是 我想要做的是当有 换行
  • 批处理脚本 - 以编程方式在 Windows XP 中创建用户

    有没有办法通过批处理脚本在 Windows XP 中创建用户 甚至为其分配管理员 有限用户值 假设用户名是 rased 密码是 passS net user rased pAsS add net localgroup administrat
  • fork()如何知道自己是在子进程还是在父进程? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当执行 fork 系统调用时 处理器转入内核模式 因此 在 fork 调用结束时 会生成一个新进程 其中包含调用进程的几乎所有结构的副
  • 了解 aiohttp.TCPConnector 池和连接限制

    我正在尝试limit and limit per host参数为aiohttp connector TCPConnector 在下面的脚本中 我通过connector aiohttp connector TCPConnector limit