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里使用正则表达式的全匹配功能
Oct 19 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
python实现飞行棋游戏
Feb 05 Python
python实现梯度下降法
Mar 24 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
python 实现任务管理清单案例
Apr 25 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Python实现Kerberos用户的增删改查操作
Dec 14 Python
python实现图片转字符画
Feb 19 Python
基于flask实现五子棋小游戏
May 25 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
php 远程图片保存到本地的函数类
2008/12/08 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
Javascript继承机制详解
2017/05/30 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
python解析中国天气网的天气数据
2014/03/21 Python
python获取list下标及其值的简单方法
2016/09/12 Python
django的ORM操作 增加和查询
2019/07/26 Python
python中取绝对值简单方法总结
2020/07/24 Python
了解一下python内建模块collections
2020/09/07 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
四年大学生活的自我评价范文
2014/02/07 职场文书
2014年计生工作总结
2014/11/21 职场文书
消防宣传语大全
2015/07/13 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
详解java如何集成swagger组件
2021/06/21 Java/Android