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 相关文章推荐
10款最好的Web开发的 Python 框架
Mar 18 Python
利用python发送和接收邮件
Sep 27 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
django请求返回不同的类型图片json,xml,html的实例
May 22 Python
在python中实现对list求和及求积
Nov 14 Python
实时获取Python的print输出流方法
Jan 07 Python
详解Python的三种可变参数
May 08 Python
基于Python函数和变量名解析
Jul 19 Python
python 实现识别图片上的数字
Jul 30 Python
详解一种用django_cache实现分布式锁的方式
Sep 01 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 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删除数组中的特定元素的代码
2012/06/28 PHP
php异常处理使用示例
2014/02/25 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
javascript 类方法定义还是有点区别
2009/04/15 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
JQuery的Ajax请求实现局部刷新的简单实例
2014/02/11 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
Python2与Python3的区别点整理
2019/12/12 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
台湾三立电视电商平台:电电购
2019/09/09 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
食堂员工工作职责
2013/12/18 职场文书
四风之害观后感
2015/06/09 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS