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列表推导式的使用方法
Nov 21 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
Python中flatten( )函数及函数用法详解
Nov 02 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
Python对wav文件的重采样实例
Feb 25 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
python基础之匿名函数详解
Apr 21 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP工程师VIM配置分享
2015/12/15 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
vuex实现购物车功能
2020/06/28 Javascript
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
python编程使用协程并发的优缺点
2018/09/20 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
Python八皇后问题解答过程详解
2019/07/29 Python
python add_argument()用法解析
2020/01/29 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
党建示范点实施方案
2014/03/12 职场文书
国际商务英语专业求职信
2014/07/08 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
小学班级管理心得体会
2016/01/07 职场文书