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






相关文章
|
9天前
|
数据采集
Haskell爬虫:连接管理与HTTP请求性能
Haskell爬虫:连接管理与HTTP请求性能
|
3天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
22 7
|
10天前
|
机器学习/深度学习 PyTorch 算法框架/工具
python这些库和框架哪个更好
【9月更文挑战第2天】python这些库和框架哪个更好
25 6
|
10天前
|
机器学习/深度学习 数据采集 算法框架/工具
python有哪些常用的库和框架
【9月更文挑战第2天】python有哪些常用的库和框架
16 6
WK
|
10天前
|
数据采集 XML 安全
常用的Python网络爬虫库有哪些?
Python网络爬虫库种类丰富,各具特色。`requests` 和 `urllib` 简化了 HTTP 请求,`urllib3` 提供了线程安全的连接池,`httplib2` 则具备全面的客户端接口。异步库 `aiohttp` 可大幅提升数据抓取效率。
WK
29 1
|
12天前
|
机器学习/深度学习 存储 算法
NumPy 与 SciPy:Python 科学计算库的比较
【8月更文挑战第30天】
35 1
|
4天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
21 0
|
NoSQL Go MongoDB
一日一技:在 Python 中实现延迟调用
一日一技:在 Python 中实现延迟调用
266 0
一日一技:在 Python 中实现延迟调用
|
2天前
|
存储 数据采集 人工智能
探索Python编程之美——从基础到进阶
【9月更文挑战第9天】本文是一篇深入浅出的技术分享文章,旨在引导读者从零基础开始掌握Python编程。我们将通过生动的实例和代码示例,探讨Python的基本语法、数据结构、函数、模块以及面向对象编程等核心概念。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python编程之旅吧!
17 11
|
3天前
|
Python
探索Python编程的奥秘:打造你的第一个程序
【9月更文挑战第8天】本文将带你进入Python编程的世界,通过一个有趣的项目——制作一个简单的猜数字游戏,让你快速入门。我们不仅会分享代码编写的步骤,还会讲解每一行代码的含义和作用,确保即使是编程新手也能跟上节奏。文章末尾附有完整代码,方便读者实践和学习。
19 12