代码之家  ›  专栏  ›  技术社区  ›  Brad Solomon

何时应将单个会话实例用于请求?

  •  1
  • Brad Solomon  · 技术社区  · 8 年前

    从 aiohttp 文件:

    [安] aiohttp.ClientSession ]默认情况下,封装连接池(连接器实例)并支持keepalives。 除非在应用程序的生命周期内连接到大量未知数量的不同服务器,否则建议在应用程序的生命周期内使用单个会话,以从连接池中获益。

    我几乎总是习惯保持单身 ClientSession 实例(已启用Cookie&自定义连接器/适配器*),用于任何大小或容器的URL,无论这些URL有多异构或有多少个。我想知道这种方法是否有缺点。

    我希望对“大量未知数量的不同服务器”在实践中的构成有一个更精细的上下文定义。对于下面介绍的这种情况,最佳做法是什么?应该 客户会话

    通常情况下,我有“批”的端点;每批的netloc是同质的,但批之间的netloc是不同的。例如

    urls = {
        'https://aiohttp.readthedocs.io/en/stable/index.html',
        'https://aiohttp.readthedocs.io/en/stable/client_reference.html',
        'https://aiohttp.readthedocs.io/en/stable/web_advanced.html#aiohttp-web-middlewares',
    
        'https://www.thesaurus.com/',
        'https://www.thesaurus.com/browse/encapsulate',
        'https://www.thesaurus.com/browse/connection?s=t',
    
        'https://httpbin.org/',
        'https://httpbin.org/#/HTTP_Methods',
        'https://httpbin.org/status/200'
    }
    


    *我现在所做的是通过将连接器实例传递给任何一个主机来限制到任何一个主机的开放连接 客户会话 aiohttp.TCPConnector(limit_per_host=10) .

    **具体来说, {'www.thesaurus.com', 'aiohttp.readthedocs.io', 'httpbin.org'} 即 set(urllib.parse.urlsplit(u).netloc for u in urls)

    1 回复  |  直到 8 年前
        1
  •  2
  •   Martijn Pieters    6 年前

    当需要时,您需要使用一个带有自己连接器的专用会话

    1. 您需要为一组连接自定义连接器参数(例如,更改每个主机的限制,或更改SSL配置,或设置不同的超时)。
    2. 您将运行默认的100个连接限制,此时到现有主机的缓存连接被回收的可能性与仍然打开的可能性相同。

    一些 这些主机中的一个比其他主机更经常被联系。如果“大数字”是>100,则很可能您必须继续为以前已连接到的“常用”主机打开新连接,因为池必须关闭这些连接才能为当前不在池中的主机创建连接。那会影响表演。

    但如果你创造了一个 分离 池中的“频繁”主机,然后您可以保持这些主机连接打开的时间更长。他们不必与那些不常使用的主机连接竞争“通用”池中的免费连接。

    作为比较 requests 库(一个同步httpapi)处理这个问题的方式稍有不同 register separate transport adapters per url prefix .