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 31 Python
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
Jun 15 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
Python人脸识别初探
Dec 21 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
python+openCV利用摄像头实现人员活动检测
Jun 22 Python
详解python中的index函数用法
Aug 06 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
让你相见恨晚的十个Python骚操作
Nov 18 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
初识ThinkPHP控制器
2016/04/07 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
jQuery前台数据获取实现代码
2011/03/16 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
javascript正则表达式总结
2016/02/29 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python中list初始化方法示例
2016/09/18 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
Django实现学员管理系统
2019/02/26 Python
详解Scrapy Redis入门实战
2020/11/18 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
什么是规则表达式
2012/05/03 面试题
服务员自我评价
2014/01/25 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
毕业生应聘求职信
2014/07/10 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技