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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
python fabric使用笔记
May 09 Python
python操作字典类型的常用方法(推荐)
May 16 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
python实现八大排序算法(1)
Sep 14 Python
Selenium定位元素操作示例
Aug 10 Python
python把转列表为集合的方法
Jun 28 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
Python tkinter实现日期选择器
Feb 22 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 file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
vue实现登录拦截
2020/06/29 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
Python写入数据到MP3文件中的方法
2015/07/10 Python
python保存数据到本地文件的方法
2018/06/23 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
python简单验证码识别的实现方法
2019/05/10 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
django 取消csrf限制的实例
2020/03/13 Python
Django nginx配置实现过程详解
2020/09/10 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
2014年安全生产大检查方案
2014/05/13 职场文书
信仰观后感
2015/06/03 职场文书
丧事酒宴答谢词
2015/09/30 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书