Python grequests 库实现高效并发 HTTP 请求
本文介绍如何使用 Python 的 grequests 库实现高效的并发 HTTP 请求。通过对比 requests 串行与 grequests 并发的性能差异,展示其在批量请求场景下的显著优势。内容涵盖安装配置、基本用法、性能测试数据及自定义异常处理机制,帮助开发者提升接口测试效率。
前言
grequests 简介与安装
在 Python 生态中,requests 库因其简洁易用而成为发送接口请求的首选工具,由 Kenneth Reitz 开发。然而,requests 默认采用串行模式发送请求,即当前请求阻塞直到完成才会发起下一个请求,这在需要高并发处理的场景下效率较低。为了提升测试或数据抓取效率,通常需引入多线程、协程、gevent 或 aiohttp 等方案,但这些方式配置相对复杂。
grequests 正是为了解决上述痛点而生,它由 Kenneth Reitz 基于 gevent 和 requests 封装而成,提供了极简的并发请求接口。
安装 grequests 前需先安装依赖库 gevent,命令如下:pip install gevent grequests。项目开源地址为:https://github.com/spyoungtech/grequests。
基本用法与示例
grequests 简单使用
使用 grequests 的核心步骤是构造请求列表,并调用 grequests.map() 方法并行发送这些请求。该方法会阻塞直到所有请求完成,并返回一个响应对象列表。具体示例如下。
import grequests
req_list = [ # 请求列表
grequests.get('http://httpbin.org/get?a=1&b=2'),
grequests.post('http://httpbin.org/post', data={'a':1,'b':2}),
grequests.put('http://httpbin.org/post', json={'a': 1, 'b': 2}),
]
res_list = grequests.map(req_list) # 并行发送,等最后一个运行完后返回
print(res_list[0].text) # 打印第一个请求的响应文本
grequests 完全兼容 requests 支持的 HTTP 方法,包括 get、post、put、delete 等,且参数传递方式与 requests 保持一致,极大降低了学习成本。获取响应列表后,只需遍历该列表即可获取所有请求的返回结果。
性能对比测试
grequests 和 requests 性能对比
为了直观展示并发优势,我们可以对比使用 requests 串行发送与 grequests 并行发送 100 次访问 github.com 接口所需的时间。以下是 requests 串行处理的示例代码。
import requests
import time
start = time.time()
res_list = [requests.get('https://github.com') for i in range(100)]
print(time.time()-start)
在实际测试中,使用 requests 串行处理 100 次请求的实际耗时约为 100 秒以上。
接下来是使用 grequests 进行并行发送的示例代码。
import grequests
import time
start = time.time()
req_list = [grequests.get('https://github.com') for i in range(100)]
res_list = grequests.map(req_list)
print(time.time()-start)
在相同条件下,使用 grequests 并行发送 100 次请求的实际耗时约为 3.58 秒,性能提升显著。
异常处理机制
异常处理
在批量发送请求时,难免会遇到 URL 不可达、网络超时或服务器返回错误状态等异常情况。grequests.map() 方法支持通过 exception_handler 参数传入自定义异常处理函数,以便对错误进行统一捕获和处理。具体示例如下。
import grequests
def err_handler(request, exception):
print("请求出错")
req_list = [
grequests.get('http://httpbin.org/delay/1', timeout=0.001), # 超时异常
grequests.get('http://fakedomain/'), # 该域名不存在
grequests.get('http://httpbin.org/status/500') # 正常返回500的请求
]
res_list = grequests.map(reqs, exception_handler=err_handler)
print(res_list)
运行结果:
请求出错 请求出错 [None, None, <Response [500]>]
以上就是 Python 使用 grequests 并发发送请求的示例的详细内容,更多关于Python grequests发送请求的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













