限制最大并发连接数是否也限制了并发请求数?
Does limiting the maximum number of concurrent connections also limit the number of concurrent requests?
This Web tutorial and also 推荐使用信号量来限制使用 aiohttp 发出的并发请求数。
我很困惑,因为 aiohttp
本身提供了一种工具来限制并发连接数(limit
和 limit_per_host
、documented here)- 使用也是如此信号量没有重新发明轮子?
也许不是。每个连接可以有多个并发请求吗?根据 this Wikipedia article and also ,似乎可以。所以也许在 aiohttp
中设置 limit
and/or limit_per_host
,根据我链接到的文档限制并发 连接 ,没有限制并发 请求的效果 .
我仍然很困惑,因为如果是这种情况,aiohttp
提供的这些参数有什么用?为什么用户想要限制 connections 而不是 requests?但是这样的推理当然没有任何意义,所以我准备继续使用信号量。
然后我偶然发现了 。它有两个相对高度赞成的答案。这些答案之一再次建议使用信号量。但另一个答案建议使用 aiohttp
设施 limit
和 limit_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 客户端库发出并发请求。依赖 aiohttp
的 limit
不会影响其他库。另一方面,全局信号量将允许限制所有请求,无论它们是如何实现的。
维基百科文章提到了持久连接,即为多个请求重新使用相同的 TCP 连接,请求仍然是串行的而不是并发的。 HTTP/2 确实允许在单个 TCP 连接上多路复用 并发 请求,但 aiohttp 没有实现它。
这使得两个限制等价:限制并行连接数有效地限制了并发请求数。正如 Mikhail 指出的那样,这可以被视为实现细节。
This Web tutorial and also
我很困惑,因为 aiohttp
本身提供了一种工具来限制并发连接数(limit
和 limit_per_host
、documented here)- 使用也是如此信号量没有重新发明轮子?
也许不是。每个连接可以有多个并发请求吗?根据 this Wikipedia article and also aiohttp
中设置 limit
and/or limit_per_host
,根据我链接到的文档限制并发 连接 ,没有限制并发 请求的效果 .
我仍然很困惑,因为如果是这种情况,aiohttp
提供的这些参数有什么用?为什么用户想要限制 connections 而不是 requests?但是这样的推理当然没有任何意义,所以我准备继续使用信号量。
然后我偶然发现了 aiohttp
设施 limit
和 limit_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 客户端库发出并发请求。依赖 aiohttp
的 limit
不会影响其他库。另一方面,全局信号量将允许限制所有请求,无论它们是如何实现的。
维基百科文章提到了持久连接,即为多个请求重新使用相同的 TCP 连接,请求仍然是串行的而不是并发的。 HTTP/2 确实允许在单个 TCP 连接上多路复用 并发 请求,但 aiohttp 没有实现它。
这使得两个限制等价:限制并行连接数有效地限制了并发请求数。正如 Mikhail 指出的那样,这可以被视为实现细节。