限制最大并发连接数是否也限制了并发请求数?

Does limiting the maximum number of concurrent connections also limit the number of concurrent requests?

This Web tutorial and also 推荐使用信号量来限制使用 aiohttp 发出的并发请求数。

我很困惑,因为 aiohttp 本身提供了一种工具来限制并发连接数(limitlimit_per_hostdocumented here)- 使用也是如此信号量没有重新发明轮子?

也许不是。每个连接可以有多个并发请求吗?根据 this Wikipedia article and also ,似乎可以。所以也许在 aiohttp 中设置 limit and/or limit_per_host,根据我链接到的文档限制并发 连接 ,没有限制并发 请求的效果 .

我仍然很困惑,因为如果是这种情况,aiohttp 提供的这些参数有什么用?为什么用户想要限制 connections 而不是 requests?但是这样的推理当然没有任何意义,所以我准备继续使用信号量。

然后我偶然发现了 。它有两个相对高度赞成的答案。这些答案之一再次建议使用信号量。但另一个答案建议使用 aiohttp 设施 limitlimit_per_host。如果这个答案是正确的,那么在 aiohttp 中限制 connections 也会限制 requests - 所以不需要信号量 (除非人们还希望限制每秒的请求率,这不是我在这里要解决的问题)

这就是我想在这个问题中提出的问题。通过limit and/or limit_per_host限制aiohttp中的并发连接是否也限制并发请求 ?我想答案取决于 aiohttp 是否每个请求只使用一个连接,我也不知道。

是否 aiohttp 每个请求仅使用一个连接?限制并发连接是否也限制并发请求?

Does aiohttp only use one connection per request?

默认情况下,如果您使用相同的 ClientSession 实例向单个主机发出多个请求,aiohttp 可以重用现有连接:By default all connectors support keep-alive connections (source)

您可以使用 connector_owner=False (source) 在不同会话之间共享连接。

但是如果您要问的是单一连接,则只能通过单一连接发出单一请求。


Does limiting concurrent connections also limit concurrent requests?

确实如此(例如,参见情节 ),但无论如何您都不应该依赖它。

"Connection limit" 是 aiohttp 请求实现的底层细节。你真的不想处理低级细节,你想要的是处理高级抽象 "limit number of concurrent requests"。这就是信号量的用途。

为了更好地理解这个想法,请考虑以下情况:您的脚本同时使用 aiohttp 和其他一些 http 客户端库发出并发请求。依赖 aiohttplimit 不会影响其他库。另一方面,全局信号量将允许限制所有请求,无论它们是如何实现的。

维基百科文章提到了持久连接,即为多个请求重新使用相同的 TCP 连接,请求仍然是串行的而不是并发的。 HTTP/2 确实允许在单个 TCP 连接上多路复用 并发 请求,但 aiohttp 没有实现它。

这使得两个限制等价:限制并行连接数有效地限制了并发请求数。正如 Mikhail 指出的那样,这可以被视为实现细节。