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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 Python
Python入门篇之列表和元组
Oct 17 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 Python
python删除过期log文件操作实例解析
Jan 31 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
如何基于python操作excel并获取内容
Dec 24 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
Python基于time模块表示时间常用方法
Jun 18 Python
python如何操作mysql
Aug 17 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
k-means & DBSCAN 总结
Apr 27 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
javascript 节点遍历函数
2010/03/28 Javascript
(function($){...})(jQuery)的意思
2010/07/22 Javascript
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
python根据路径导入模块的方法
2014/09/30 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
超市促销实习自我鉴定
2013/09/23 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
春游踏青活动方案
2014/08/14 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
先进基层党组织事迹材料
2014/12/25 职场文书
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技