python requests库如何使用http连接池降低延迟 keepalive复用连接

简介: Python的`requests`库通过内置的连接池机制支持HTTP Keep-Alive特性,允许复用TCP连接以发送多个请求,减少连接开销。默认情况下,`requests`不显式禁用Keep-Alive,其行为取决于底层HTTP库(如urllib3)及服务器的支持。通过创建`Session`对象并自定义`HTTPAdapter`,可以调整连接池大小和重试策略,进一步优化连接复用。测试显示,使用`Session`和定制的`HTTPAdapter`比普通请求方法能显著减少连续请求间的时间消耗,体现了Keep-Alive的优势。

Python的requests库默认情况下不明确开启HTTP Keep-Alive特性,但这并不意味着它完全不支持连接复用。实际上,大多数现代HTTP库和Web服务器都隐式支持Keep-Alive,这是一种HTTP协议特性,允许在同一个TCP连接上发送多个请求,从而减少建立和关闭连接的开销。

在requests中,连接是否保持活动状态主要依赖于底层的HTTP库(通常是urllib3)以及与之通信的服务器的支持情况。默认配置下,urllib3会遵循服务器的Keep-Alive指示,如果服务器表明支持Keep-Alive,那么连接会在一段时间内保持打开状态,供后续请求复用,直到达到某个超时时间或者达到最大连接数限制。

虽然requests本身不直接提供控制Keep-Alive行为的选项,但你可以在创建Session对象时,通过自定义TransportAdapter来间接调整与Keep-Alive相关的超时和重用策略,从而影响连接的复用行为。例如,可以通过调整连接池的大小来影响连接的复用程度。

简单来说,requests默认情况下能利用Keep-Alive特性实现一定程度的连接复用,但具体的复用策略和效率更多地依赖于网络环境、服务器配置以及请求的具体情况。如果你需要更细粒度的控制,可以通过更高级的配置来调整这些行为。



写了一个代码的对比测试, 测试结果在后面



代码如下


import time
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# 创建一个带有重试策略和连接池设置的自定义 HTTPAdapter
adapter = HTTPAdapter(
    pool_connections=10,  # 连接池中的最大连接数
    pool_maxsize=10,      # 连接池中的最大连接数
    max_retries=Retry(  # 设置重试策略
        total=3,
        backoff_factor=0.1,
        status_forcelist=[500, 502, 503, 504]
    )
)

# 创建一个 Session 并挂载自定义的 HTTPAdapter
session = requests.Session()
session.mount('https://', adapter)
session.mount('http://', adapter)


# 使用http连接池, keepalive 复用连接
for i in range(5):
    t1 = time.time()
    response = session.get('https://httpbin.org/get')
    print(f"Response: {response.status_code}")
    t2 = time.time()
    print(f"第{i} 次请求, 使用session 连接池, time use: ", int(1000*(t2-t1)))


# 使用普通请求, 不用连接池
for i in range(5):
    t1 = time.time()
    response = requests.get('https://httpbin.org/get')
    print(f"Response: {response.status_code}")
    t2 = time.time()
    print(f"第{i} 次请求, 不适用连接池, time use: ", int(1000*(t2-t1)))




测试结果


$./venv/bin/python 1.py 
Response: 200
第0 次请求, 使用session 连接池, time use:  945
Response: 200
第1 次请求, 使用session 连接池, time use:  553
Response: 200
第2 次请求, 使用session 连接池, time use:  215
Response: 200
第3 次请求, 使用session 连接池, time use:  216
Response: 200
第4 次请求, 使用session 连接池, time use:  216
Response: 200
第0 次请求, 不适用连接池, time use:  1356
Response: 200
第1 次请求, 不适用连接池, time use:  2026
Response: 200
第2 次请求, 不适用连接池, time use:  1078
Response: 200
第3 次请求, 不适用连接池, time use:  1114
Response: 200
第4 次请求, 不适用连接池, time use:  869



还有一个更简单的写法


在Python的requests库中,默认情况下,并没有开启keep-alive效果。这意味着每次发起请求时,都会创建一个新的TCP连接。

然而,requests库确实支持连接复用功能。你可以通过设置session来实现


简化后的代码如下:

import time
import requests

# 创建一个 Session 并挂载自定义的 HTTPAdapter
session = requests.Session()

# 使用http连接池, keepalive 复用连接
for i in range(5):
    t1 = time.time()
    response = session.get('https://httpbin.org/get')
    print(f"Response: {response.status_code}")
    t2 = time.time()
    print(f"第{i} 次请求, 使用session 连接池, time use: ", int(1000*(t2-t1)))


# 使用普通请求, 不用连接池
for i in range(5):
    t1 = time.time()
    response = requests.get('https://httpbin.org/get')
    print(f"Response: {response.status_code}")
    t2 = time.time()
    print(f"第{i} 次请求, 不适用连接池, time use: ", int(1000*(t2-t1)))




测试结果如下


$./venv/bin/python 1.py 
Response: 200
第0 次请求, 使用session 连接池, time use:  869
Response: 200
第1 次请求, 使用session 连接池, time use:  332
Response: 200
第2 次请求, 使用session 连接池, time use:  218
Response: 200
第3 次请求, 使用session 连接池, time use:  227
Response: 200
第4 次请求, 使用session 连接池, time use:  217
Response: 200
第0 次请求, 不适用连接池, time use:  858
Response: 200
第1 次请求, 不适用连接池, time use:  874
Response: 200
第2 次请求, 不适用连接池, time use:  880
Response: 200
第3 次请求, 不适用连接池, time use:  865
Response: 200
第4 次请求, 不适用连接池, time use:  1855






相关文章
|
4月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
516 130
|
6月前
|
存储 Web App开发 前端开发
Python + Requests库爬取动态Ajax分页数据
Python + Requests库爬取动态Ajax分页数据
|
6月前
|
Web App开发 安全 数据安全/隐私保护
利用Python+Requests实现抖音无水印视频下载
利用Python+Requests实现抖音无水印视频下载
|
4月前
|
存储 网络协议 算法
从HPACK到多路复用,揭秘HTTP/2如何终结网络拥堵
HTTP/2通过HPACK压缩头部冗余信息,提升传输效率;并利用多路复用技术,在单个TCP连接上并行处理多个请求,避免队头阻塞,显著提升性能。同时支持服务器推送和流优先级设置,优化资源加载体验。
261 7
|
6月前
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
580 51
|
5月前
|
数据采集 监控 调度
应对频率限制:设计智能延迟的微信读书Python爬虫
应对频率限制:设计智能延迟的微信读书Python爬虫
|
6月前
|
数据采集 API 调度
Python爬虫框架对比:Scrapy vs Requests在API调用中的应用
本文对比了 Python 中 Scrapy 与 Requests 两大爬虫框架在 API 调用中的差异,涵盖架构设计、调用模式、性能优化及适用场景,并提供实战建议,助力开发者根据项目需求选择合适工具。
|
7月前
|
JSON 数据格式 Python
解决Python requests库POST请求参数顺序问题的方法。
总之,想要在Python的requests库里保持POST参数顺序,你要像捋顺头发一样捋顺它们,在向服务器炫耀你那有条不紊的数据前。抓紧手中的 `OrderedDict`与 `json`这两把钥匙,就能向服务端展示你的请求参数就像经过高端配置的快递包裹,里面的商品摆放井井有条,任何时候开箱都是一种享受。
152 10
|
Web App开发 前端开发

推荐镜像

更多