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 (1)
Oct 31 Python
python实现贪吃蛇游戏
Mar 21 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
Django models.py应用实现过程详解
Jul 29 Python
python向图片里添加文字
Nov 26 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
利用python绘制正态分布曲线
Jan 04 Python
python asyncio 协程库的使用
Jan 21 Python
python字典进行运算原理及实例分享
Aug 02 Python
python实现双向链表原理
May 25 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
FleaPHP的安全设置方法
2008/09/15 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
超链接怎么正确调用javascript函数
2016/05/23 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
python集合类型用法分析
2015/04/08 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
Python中new方法的详解
2019/01/15 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
会计专业大学生求职信范文
2014/01/28 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
停课通知书
2015/04/24 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
色戒观后感
2015/06/12 职场文书
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技