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之一个免费的实验室
Sep 14 Python
自己使用总结Python程序代码片段
Jun 02 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
Python线性方程组求解运算示例
Jan 17 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
python颜色随机生成器的实例代码
Jan 10 Python
在pycharm中创建django项目的示例代码
May 28 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
介绍php设计模式中的工厂模式
2008/06/12 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php实现URL加密解密的方法
2016/11/17 PHP
CI框架附属类用法分析
2018/12/26 PHP
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python命令行解析模块详解
2018/02/01 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
基于python中__add__函数的用法
2019/11/25 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
数控个人求职信范文
2014/02/03 职场文书
大学军训感言300字
2014/03/09 职场文书
道歉信怎么写
2015/05/12 职场文书
车辆管理制度范本
2015/08/05 职场文书
浅谈MySQL函数
2021/10/05 MySQL
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python