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入门篇之对象类型
Oct 17 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
Python装饰器用法实例总结
Feb 07 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python发展简史 Python来历
May 14 Python
详解Python的循环结构知识点
May 20 Python
django基础学习之send_mail功能
Aug 07 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
超级实用的8个Python列表技巧
Aug 24 Python
如何在Python项目中引入日志
May 31 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防注入代码
2010/04/07 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
node.js中的fs.read方法使用说明
2014/12/17 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
jQuery基于ajax实现星星评论代码
2015/08/07 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
js new Date()实例测试
2019/10/31 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python绘制封闭多边形教程
2020/02/18 Python
如何利用Python识别图片中的文字
2020/05/31 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
三星印度官网:Samsung印度
2019/08/03 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
为什么需要版本控制
2016/10/28 面试题
药学专业大学生自荐信
2013/09/28 职场文书
学生手册家长评语
2014/02/10 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
js不常见操作运算符总结
2021/11/20 Javascript
golang生成并解析JSON
2022/04/14 Golang