requests默认不复用连接是因为每次调用requests.get()都会新建session实例,而urllib3的连接池需复用同一session才能生效;即使服务端返回connection: keep-alive,临时session也无法复用tcp连接。

为什么 requests 默认不复用连接?
requests 库底层用 urllib3,而 urllib3 默认启用连接池,但前提是 Session 实例被复用。直接调用 requests.get() 每次都会新建 Session,导致 TCP 连接无法复用——哪怕服务端明确返回了 Connection: keep-alive,客户端也用不上。
常见错误现象:
– 多次请求耗时稳定在 100–300ms(含 TCP 握手 + TLS 握手)
– 抓包看到每个请求都走 SYN → SYN-ACK → ACK,没有复用已有连接
- 必须显式创建并复用同一个
requests.Session()实例 - 不要在循环里反复调用
requests.get(url) - 若使用
urllib3.PoolManager,需手动配置maxsize和block=True才能真正复用
如何正确配置 Session 实现 Keep-Alive 复用?
关键不是加 header,而是让底层连接池生效。默认的 Session 已开启连接池,但需注意几个隐性参数:
-
pool_connections:控制「主机名到连接池」的映射数量,默认 10 —— 如果你请求 20 个不同域名,后 10 个会 fallback 到新池,无法复用 -
pool_maxsize:单个池最大空闲连接数,默认 10 —— 并发高时会被打满,后续请求排队或新建连接 - HTTP/2 不在此机制内,requests 当前(v2.31+)仍基于 HTTP/1.1,依赖
Connection: keep-alive和底层 socket 复用
示例:
import requests
<p>session = requests.Session()
session.headers.update({"User-Agent": "my-app/1.0"})</p><h1>显式扩大连接池,适配高频请求场景</h1><p>session.mount("https://", requests.adapters.HTTPAdapter(
pool_connections=20,
pool_maxsize=20,
max_retries=2
))</p><h1>后续所有请求都走同一组连接池</h1><p>for url in urls:
resp = session.get(url) # ✅ 复用连接
</p>
requests 复用连接时,哪些 header 会影响行为?
绝大多数情况不用手动设 Connection: keep-alive —— urllib3 会自动加;但以下 header 会触发提前关闭或禁用复用:
-
Connection: close:强制断连,即使服务端支持 keep-alive,客户端也会在响应后主动FIN -
Proxy-Connection: close:某些老旧代理会识别它并切断,建议删掉 - 自定义
Connectionheader 且值非法(如空字符串、多余空格),urllib3 可能静默忽略或报错InvalidHeader
检查方式:打印 resp.raw._connection.pool.num_connections(非公开属性,仅调试用),正常复用时该值应缓慢增长后趋于稳定,而非每次 +1。
并发请求下连接池不够用的表现和对策
当并发数 > pool_maxsize,urllib3 默认行为是阻塞等待空闲连接(block=True),超时抛 MaxRetryError 或卡住;若设 block=False,则直接抛 PoolTimeout。
- 典型错误信息:
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='x', port=443): Max retries exceeded...,未必是网络问题,可能是池满了 - 生产环境建议设
pool_maxsize≥ 预期并发峰值 × 1.5(考虑 DNS 解析、重试等开销) - 如果请求目标高度分散(比如每请求一个新子域),考虑按域名分组创建多个
Session,避免跨域名争抢同一池
连接复用真正起效的前提,是请求目标集中、复用频次高、且没有意外中断(如服务端主动 timeout、中间设备 kill idle 连接)。这些细节比代码多写两行 header 更影响实际耗时。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











