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






相关文章
|
5月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
592 130
|
5月前
|
存储 人工智能 测试技术
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
本文介绍如何使用LangChain结合DeepSeek实现多轮对话,测开人员可借此自动生成测试用例,提升自动化测试效率。
1042 125
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
|
5月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
456 0
|
4月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
421 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
4月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
442 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
6月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
419 18
|
6月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
591 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
6月前
|
数据采集 监控 调度
应对频率限制:设计智能延迟的微信读书Python爬虫
应对频率限制:设计智能延迟的微信读书Python爬虫
|
6月前
|
存储 监控 安全
Python剪贴板监控实战:clipboard-monitor库的深度解析与扩展应用
本文介绍了基于Python的剪贴板监控技术,结合clipboard-monitor库实现高效、安全的数据追踪。内容涵盖技术选型、核心功能开发、性能优化及实战应用,适用于安全审计、自动化办公等场景,助力提升数据管理效率与安全性。
252 0

推荐镜像

更多