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使用win32com库播放mp3文件的方法
May 30 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
详解flask入门模板引擎
Jul 18 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
win7 x64系统中安装Scrapy的方法
Nov 18 Python
Django文件存储 默认存储系统解析
Aug 02 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 Python
Python 语言实现六大查找算法
Jun 30 Python
Python之matplotlib绘制饼图
Apr 13 Python
python运算符之与用户交互
Apr 13 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类
2006/11/27 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
canvas绘制七巧板
2017/02/03 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
JS如何在数组指定位置插入元素
2020/03/10 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
python数据挖掘需要学的内容
2019/06/23 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
高中生的自我评价
2014/03/04 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
辞职书格式样本
2015/02/26 职场文书
不同意离婚代理词
2015/05/23 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Android中的Launch Mode详情
2022/06/05 Java/Android