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

5 python python-asyncio aiohttp

这个 Web 教程这个 SO answer建议使用信号量来限制使用 aiohttp 发出的并发请求的数量。

我很困惑,因为aiohttp它自己提供了一个工具来限制并发连接的数量(limitlimit_per_host记录在这里) - 那么使用信号量不是重新发明轮子吗?

也许不是。每个连接可以有多个并发请求吗?根据这篇维基百科文章这个 SO answer,似乎可以。因此,根据我链接到限制并发连接的文档,设置limit和/或limit_per_hostin可能没有限制并发请求的效果。aiohttp

我仍然很困惑,因为如果是这种情况,这些参数aiohttp提供的用途是什么?为什么用户想要限制连接而不是请求?但是这样的推理当然不需要任何东西,所以我准备继续前进并使用信号量。

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

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

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

Mik*_*mov 2

aiohttp 每个请求只使用一个连接吗?

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

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

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


限制并发连接是否也会限制并发请求?

确实如此(例如,请参阅此处的绘图),但无论如何您都不应该依赖它。

“连接限制”是一个低级细节aiohttp“连接限制”是请求实现您并不是真的想处理低级细节,您想要的是处理高级抽象“限制并发请求数量”。这就是信号量的用途。

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