为什么 Requests 打开的连接数会超过 pool_maxsize
用 pool_block 限制连接池大小,并在上限需要覆盖经过代理的全部流量时,再加一层应用级并发预算。
使用默认的 pool_block=False 时,pool_maxsize 限制的是池中保留的连接数,而不是同时打开的全部连接数。Requests 可以创建额外连接,随后再将它们丢弃。
对于由现有会话的 HTTPS 请求使用的有界连接池:
from requests.adapters import HTTPAdapter
adapter = HTTPAdapter(
pool_connections=10,
pool_maxsize=4,
pool_block=True,
)
session.mount("https://", adapter)mount 选择的是 HTTPS 目标 URL。HTTP 请求使用挂在 http:// 下的适配器。
| 输入 | 它控制什么 |
|---|---|
| pool_connections | 管理器缓存多少个连接池 |
| pool_maxsize | 单个池内的连接数 |
| pool_block=True | 等待池中连接,而不是新建额外连接 |
Requests 还会按代理 URL 缓存代理管理器。这些取值并不会在一个不断轮换的代理与目标列表上形成统一的总上限。如果要求是全部工作都经过同一个中间层,请使用应用级的并发预算。
阻塞让响应释放变得关键:读完响应体或关闭流式响应,等待中的工作才能继续。在所示配置中,Requests 的适配器并没有为这次等待连接池提供单独的超时。