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使用新浪微博api上传图片到微博示例
Jan 10 Python
Python深入学习之对象的属性
Aug 31 Python
python发送邮件功能实现代码
Jul 15 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
python语音识别实践之百度语音API
Aug 30 Python
Python OS模块实例详解
Apr 15 Python
Python 通过截图匹配原图中的位置(opencv)实例
Aug 27 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python求绝对值的三种方法小结
Dec 04 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
JpGraph php柱状图使用介绍
2011/08/23 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
2017/10/26 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
小程序实现投票进度条
2019/11/20 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
原生小程序封装跑马灯效果
2020/10/21 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
Python三级目录展示的实现方法
2016/09/28 Python
python学生管理系统代码实现
2020/04/05 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
运动会广播稿200米
2014/01/27 职场文书
总经理司机职责
2014/02/02 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
植树节标语
2014/06/27 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP