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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
python黑魔法之编码转换
Jan 25 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
Aug 01 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
Python实现直播推流效果
Nov 26 Python
python中get和post有什么区别
Jun 19 Python
python list的index()和find()的实现
Nov 16 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中将网址转换为超链接的函数
2011/09/02 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php中上传文件的的解决方案
2018/09/25 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
Python使用sklearn库实现的各种分类算法简单应用小结
2019/07/04 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
pytorch数据预处理错误的解决
2020/02/20 Python
keras之权重初始化方式
2020/05/21 Python
办公室主任主任岗位责任制
2014/02/11 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
2014年保卫工作总结
2014/12/05 职场文书
绵山导游词
2015/02/05 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
入党介绍人意见2015
2015/06/01 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
Redis 哨兵机制及配置实现
2022/03/25 Redis