5 python python-asyncio aiohttp
这个 Web 教程和这个 SO answer建议使用信号量来限制使用 aiohttp 发出的并发请求的数量。
我很困惑,因为aiohttp它自己提供了一个工具来限制并发连接的数量(limit和limit_per_host,记录在这里) - 那么使用信号量不是重新发明轮子吗?
也许不是。每个连接可以有多个并发请求吗?根据这篇维基百科文章和这个 SO answer,似乎可以。因此,根据我链接到限制并发连接的文档,设置limit和/或limit_per_hostin可能没有限制并发请求的效果。aiohttp
我仍然很困惑,因为如果是这种情况,这些参数aiohttp提供的用途是什么?为什么用户想要限制连接而不是请求?但是这样的推理当然不需要任何东西,所以我准备继续前进并使用信号量。
然后我偶然发现了这个问题。它有两个相对高度赞成的答案。这些答案之一再次建议使用信号量。但另一个答案建议使用这些aiohttp设施limit和limit_per_host. 如果这个答案是正确的,那么限制连接在aiohttp也限制了请求-所以没有信号量是必要的(除非还希望限制每秒请求的速率,这是不是我在这里抢断)
这就是我想在这个问题中提出的问题。是否限制并发连接,在aiohttp通过limit和/或limit_per_host也限制并发请求?我想答案取决于aiohttp每个请求是否只使用一个连接,我也不知道。
难道aiohttp只使用每个请求一个连接?限制并发连接是否也限制并发请求?
aiohttp 每个请求只使用一个连接吗?
默认情况下,如果您使用同一ClientSession实例向单个主机发出多个请求,aiohttp 可以重用现有连接By default all connectors support keep-alive connections:(来源)
connector_owner=False您可以使用(源)在不同会话之间共享连接。
但是,如果您要询问的话,则只能通过单个连接发出单个请求。
限制并发连接是否也会限制并发请求?
确实如此(例如,请参阅此处的绘图),但无论如何您都不应该依赖它。
“连接限制”是一个低级细节aiohttp“连接限制”是请求实现您并不是真的想处理低级细节,您想要的是处理高级抽象“限制并发请求数量”。这就是信号量的用途。
为了更好地理解这个想法,请考虑以下情况:您的脚本aiohttp同时使用另一个 http 客户端库发出并发请求。依赖aiohttp'slimit不会影响其他库。另一方面,全局信号量将允许限制所有请求,无论它们是如何实现的。
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |