Python使用grequests(gevent+requests)并发发送请求过程解析


Posted in Python onSeptember 25, 2019

前言

requests是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是requests发送请求是串行的,即阻塞的。发送完一条请求才能发送另一条请求。

为了提升测试效率,一般我们需要并行发送请求。这里可以使用多线程,或者协程,gevent或者aiohttp,然而使用起来,都相对麻烦。

grequests是K神基于gevent+requests编写的一个并发发送请求的库,使用起来非常简单。

安装方法: pip install gevent grequests

项目地址:https://github.com/spyoungtech/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支持get、post、put、delete等requests支持的HTTP请求方法,使用参数和requests一致,发送请求非常简单。
通过遍历res_list可以得到所有请求的返回结果。

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)

实际耗时约100s+

使用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)

实际耗时约3.58s

异常处理

在批量发送请求时难免遇到某个请求url无法访问或超时等异常,grequests.map()方法还支持自定义异常处理函数,示例如下。

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 相关文章推荐
python备份文件的脚本
Aug 11 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
python3+PyQt5实现拖放功能
Apr 24 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
BP神经网络原理及Python实现代码
Dec 18 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
Django单元测试中Fixtures的使用方法
Feb 26 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
详细分析Python collections工具库
Jul 16 Python
Python何绘制带有背景色块的折线图
Apr 23 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 #Python
Python 图像对比度增强的几种方法(小结)
Sep 25 #Python
pyqt5、qtdesigner安装和环境设置教程
Sep 25 #Python
python super的使用方法及实例详解
Sep 25 #Python
Pycharm+Python+PyQt5使用详解
Sep 25 #Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 #Python
Python 3.6 中使用pdfminer解析pdf文件的实现
Sep 25 #Python
You might like
php xml文件操作实现代码(二)
2009/03/20 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
document.all与WEB标准
2020/05/13 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
python sort、sorted高级排序技巧
2014/11/21 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
pandas string转dataframe的方法
2018/04/11 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
浅析NumPy 切片和索引
2020/09/02 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
优秀教师获奖感言
2014/01/31 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
学习十八大的感悟
2015/08/11 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS