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统计文件行数示例分享
Feb 21 Python
wxPython中listbox用法实例详解
Jun 01 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
python队列原理及实现方法示例
Nov 27 Python
python线性插值解析
Jul 05 Python
python压包的概念及实例详解
Feb 17 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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中文本操作的类
2007/03/17 PHP
php 字符转义 注意事项
2009/05/27 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
10款最好的Web开发的 Python 框架
2015/03/18 Python
python使用range函数计算一组数和的方法
2015/05/07 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
电信专业毕业生推荐信
2013/11/18 职场文书
医院实习介绍信
2014/01/12 职场文书
学生安全责任书
2014/04/15 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
大学生团日活动总结
2015/05/06 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
浅谈Python协程asyncio
2021/06/20 Python
Django中session进行权限管理的使用
2021/07/09 Python
全网非常详细的pytest配置文件
2022/07/15 Python