python retrying模块的使用方法详解


Posted in Python onSeptember 25, 2019

前言

我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的模块,retrying.

安装

retrying模块的安装很简单直接用匹配安装即可。

pip install retrying

retring模块通过装饰器的形式来进行重试操作的,首先我们看一个简单的例子

from retrying import retry
@retry(stop_max_attempt_number=5,wait_random_min=1000,wait_random_max=5000)
def run():
  print("开始重试")
  raise NameError

if __name__ == '__main__':
  run()

上面的代码干了哪些事呢,首先导入retring的retry模块

然后装饰一个run函数,然后调用run,函数内容很简单就是通过raise抛出一个异常,执行该代码我们发现。程序打印了五次开始重试,最后一次抛出异常,NameError。

到这里我们可以感受到重试了,就是这么简单的代码,就完成了五次重试,同时这五次重试的间隔时间也是不同的。

如果想尝试10次就把上面的stop_max_attempt_number=5,改成10即可,到这里就可以解释retry装饰器的参数了

stop_max_attempt_number:最大重试次数,超过这个次数会停止重试,并报异常。

wait_random_min:随机等待最小时间。

wait_random_max:随机等待最大时间。

好了retry的使用就是这么简单,在需要重试的函数上面加个装饰器就好了。

关键是装饰器里的参数的使用,下面列举了retrying的参数。

如果不写参数将会一直重试.

stop_max_attempt_number:在停止之前尝试的最大次数,最后一次如果还是有异常则会抛出异常,停止运行,默认为5次

@retry(stop_max_attempt_number=5)
def run():
  print("开始重试")
  raise NameError

if __name__ == '__main__':
  run()

强调总次数。

stop_max_delay:最大延迟时间,大概意思就是:如果调用的函数出现异常,那么就会重复调用这个函数,最大调用时间,默认为100毫秒

from retrying import retry
@retry(stop_max_delay=5000)
def run():
  print("开始重试")
  raise NameError
if __name__ == '__main__':
  run()

会重试5秒钟,强调总时间。

wait_fixed:两次调用方法期间停留时长, 如果出现异常则会一直重复调用,默认 1000毫秒

from retrying import retry
@retry(wait_fixed=2000)
def run():
  print("开始重试")
  raise NameError
if __name__ == '__main__':
  run()

强调间隔时间。

wait_random_min:在两次调用方法停留时长,停留最短时间,默认为0

wait_random_max:在两次调用方法停留时长,停留最长时间,默认为1000毫秒

wait_incrementing_increment:每调用一次则会增加的时长,默认 100毫秒

wait_exponential_multiplier和wait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max

retry_on_exception: 指定一个函数,如果此函数返回指定异常,则会重试,如果不是指定的异常则会退出

from retrying import retry
def run2(exception):
  return isinstance(exception, ZeroDivisionError)
@retry(retry_on_exception=run2)
def run():
  print("开始重试")
  a = 1 / 0
if __name__ == '__main__':
  run()

retry_on_result:指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出

from retrying import retry
def run2(r):
  return isinstance(r, int)
@retry(retry_on_result=run2)
def run():
  print("开始重试")
  a = 1
  return a
if __name__ == '__main__':
  run()

wrap_exception:参数设置为True/False,如果指定的异常类型,包裹在RetryError中,会看到RetryError和程序抛的Exception error

stop_func: 每次抛出异常时都会执行的函数,如果和stop_max_delay、stop_max_attempt_number配合使用,则后两者会失效

指定的stop_func会有两个参数:attempts, delay

wait_func:和stop_func用法差不多,不多描述

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
Python实现基于二叉树存储结构的堆排序算法示例
Dec 08 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 Python
Python解析json代码实例解析
Nov 25 Python
Python自动化操作实现图例绘制
Jul 09 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 #Python
python 魔法函数实例及解析
Sep 25 #Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 #Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 #Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 #Python
python异步编程 使用yield from过程解析
Sep 25 #Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 #Python
You might like
php中使用DOM类读取XML文件的实现代码
2011/12/14 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
javascript中递归的两种写法
2017/01/17 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
浅谈python中get pass用法
2019/03/19 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
使用python绘制二维图形示例
2019/11/22 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
python如何构建mock接口服务
2021/01/28 Python
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
优秀班集体事迹材料
2014/12/25 职场文书
置业顾问岗位职责
2015/02/09 职场文书
庆祝教师节活动总结
2015/03/23 职场文书