从文档中:
[一个]封装了一个连接池(连接器实例),并默认支持保活。 除非您在应用程序的生命周期内连接到大量不同的服务器,否则建议您使用单个会话来受益于连接池。
我几乎总是使用保持单个ClientSession
实例的做法(启用cookie和自定义连接器/适配器*),无论URL的大小或容器如何,无论这些URL有多么异构或它们的数量有多少。 我想知道这种方法是否存在缺点。
我希望对实践中“大量不同服务器”的概念有更精细、具体的定义。 对于下面提出的情况,最佳实践是什么? 是否应该为每个netloc专用一个ClientSession
,而不是整个集合的单个实例**? 是否决定使用单个客户端会话完全取决于响应时间?
通常情况下,我有“批次”终点;每个批次的netloc是同质的,但批次之间的netlocs是不同的。 例如,
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'
}
具体来说,我现在所做的是通过传递连接器实例到ClientSession
中,限制对任何单个主机的开放连接,其中aiohttp.TCPConnector(limit_per_host = 10)
。
要给它一个数字,在现实中,每个批次可能长度为25-50。
**具体而言,{'www.thesaurus.com','aiohttp.readthedocs.io','httpbin.org'}
即set(urllib.parse.urlsplit(u).netloc for u in urls)
。
connector
的limit
和limit_per_host
参数以及(2)会话实例本身的参数,而不是为每个批次创建单独的会话。(“但如果您为‘频繁’主机创建了单独的池,则可以更长时间地保持这些主机连接处于打开状态。”——似乎更简单的方法是仅增加1个会话的连接限制。)我理解得对吗? - Brad Solomon