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的Twisted框架的核心特性
May 25 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
深入浅析Python中的迭代器
Jun 04 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
Jul 04 Python
python利用tkinter实现屏保
Jul 30 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python爬虫之Selenium实现键盘事件
Dec 04 Python
python实现自定义日志的具体方法
May 28 Python
详解python网络进程
Jun 15 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
php4的彩蛋
2006/10/09 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
python PIL模块与随机生成中文验证码
2016/02/27 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
django解决跨域请求的问题详解
2019/01/20 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
写给女朋友的保证书
2015/05/09 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python