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






相关文章
|
24天前
|
调度 开发者 Python
Python中的异步编程:理解asyncio库
在Python的世界里,异步编程是一种高效处理I/O密集型任务的方法。本文将深入探讨Python的asyncio库,它是实现异步编程的核心。我们将从asyncio的基本概念出发,逐步解析事件循环、协程、任务和期货的概念,并通过实例展示如何使用asyncio来编写异步代码。不同于传统的同步编程,异步编程能够让程序在等待I/O操作完成时释放资源去处理其他任务,从而提高程序的整体效率和响应速度。
|
13天前
|
XML 存储 数据库
Python中的xmltodict库
xmltodict是Python中用于处理XML数据的强大库,可将XML数据与Python字典相互转换,适用于Web服务、配置文件读取及数据转换等场景。通过`parse`和`unparse`函数,轻松实现XML与字典间的转换,支持复杂结构和属性处理,并能有效管理错误。此外,还提供了实战案例,展示如何从XML配置文件中读取数据库连接信息并使用。
Python中的xmltodict库
|
16天前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
|
20天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
53 4
|
20天前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
30 2
|
26天前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
42 7
|
26天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
38 3
|
19天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
26天前
|
文字识别 自然语言处理 API
Python中的文字识别利器:pytesseract库
`pytesseract` 是一个基于 Google Tesseract-OCR 引擎的 Python 库,能够从图像中提取文字,支持多种语言,易于使用且兼容性强。本文介绍了 `pytesseract` 的安装、基本功能、高级特性和实际应用场景,帮助读者快速掌握 OCR 技术。
42 0
|
SQL 关系型数据库 MySQL
Python中连接MySQL数据库并进行增删改查操作
Python中连接MySQL数据库并进行增删改查操作
85 1