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






相关文章
|
2月前
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
81 20
|
16天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
46 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
2月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
135 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
3月前
|
XML JSON 数据库
Python的标准库
Python的标准库
190 77
|
9天前
|
Web App开发 数据采集 数据安全/隐私保护
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南
|
JSON 测试技术 数据格式
python接口自动化测试 - requests库的post请求进行文件上传
python接口自动化测试 - requests库的post请求进行文件上传
844 0
python接口自动化测试 - requests库的post请求进行文件上传
|
JSON 测试技术 网络安全
python接口自动化测试 - requests库的基础使用
python接口自动化测试 - requests库的基础使用
137 0
python接口自动化测试 - requests库的基础使用
|
测试技术 Python
python接口自动化测试 - requests库的post请求进行文件下载
python接口自动化测试 - requests库的post请求进行文件下载
1331 0
|
JSON 测试技术 数据格式
python接口自动化测试(二)-requests.get()
环境搭建好后,接下来我们先来了解一下requests的一些简单使用,主要包括: requests常用请求方法使用,包括:get,post requests库中的Session、Cookie的使用 其它高级部分:认证、代理、证书验证、超时配置、错误异常处理等。
1177 0
|
JSON 测试技术 数据格式
python接口自动化测试(三)-requests.post()
上一节介绍了  requests.get()  方法的基本使用,本节介绍  requests.post()  方法的使用:   本文目录: 一、方法定义 二、post方法简单使用   1、带数据的post   2、带header的post   3、带json的post   4、带参数...
2057 0