Python使用grequests并发发送请求的示例


Posted in Python onNovember 05, 2020

前言

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使用grequests并发发送请求的示例的详细内容,更多关于Python grequests发送请求的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 判断一个进程是否存在
Apr 09 Python
python实现目录树生成示例
Mar 28 Python
python中实现定制类的特殊方法总结
Sep 28 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
wxPython的安装与使用教程
Aug 31 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
Aug 28 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
如何使用Django Admin管理后台导入CSV
Nov 06 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 #Python
Python中常用的os操作汇总
Nov 05 #Python
Python Web项目Cherrypy使用方法镜像
Nov 05 #Python
Python实现异步IO的示例
Nov 05 #Python
Python requests HTTP验证登录实现流程
Nov 05 #Python
Python包资源下载路径报404解决方案
Nov 05 #Python
如何一键升级Python所有包
Nov 05 #Python
You might like
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
Python urls.py的三种配置写法实例详解
2017/04/28 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
tensorflow获取变量维度信息
2018/03/10 Python
PyQt5每天必学之布局管理
2018/04/19 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
祖国在我心中演讲稿
2014/01/15 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
单位绩效考核方案
2014/05/11 职场文书
保留意见审计报告
2015/06/05 职场文书
护士医德医风心得体会
2016/01/25 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
Python基础详解之描述符
2021/04/28 Python
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript