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通过exifread模块获得图片exif信息的方法
Mar 16 Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
Tensorflow的梯度异步更新示例
Jan 23 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
python logging模块的使用详解
Oct 23 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 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笔试题
2009/08/04 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
php分页查询的简单实现代码
2017/03/14 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
JQuery核心函数是什么及使用方法介绍
2016/05/03 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
[03:00]2018完美盛典_最佳英雄奖
2018/12/17 DOTA
跟老齐学Python之网站的结构
2014/10/24 Python
Python多进程机制实例详解
2015/07/02 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
历史学专业推荐信
2013/11/06 职场文书
活动宣传策划方案
2014/05/23 职场文书
会计毕业生自荐书
2014/06/12 职场文书
办公室岗位职责范本
2015/04/11 职场文书
刑事起诉书范文
2015/05/19 职场文书
2015年财政局工作总结
2015/05/21 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python
JS实现九宫格拼图游戏
2022/06/28 Javascript