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中的几种数据类型
Jan 02 Python
Python3.6正式版新特性预览
Dec 15 Python
python字典操作实例详解
Nov 16 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Python实现的简单排列组合算法示例
Jul 04 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python 中的参数传递、返回值、浅拷贝、深拷贝
Jun 25 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
Python @property装饰器原理解析
Jan 22 Python
python模块内置属性概念及实例
Feb 18 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
基于Python实现股票收益率分析
Apr 02 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实现的MySQL通用查询程序
2007/03/11 PHP
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
smarty模板判断数组为空的方法
2015/06/10 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
Javascript操作URL函数修改版
2013/11/07 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
python requests使用socks5的例子
2019/07/25 Python
django删除表重建的实现方法
2019/08/28 Python
Python爬虫实现“盗取”微信好友信息的方法分析
2019/09/16 Python
python使用配置文件过程详解
2019/12/28 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
环境工程专业自荐信范文
2014/06/24 职场文书
房屋维修协议书范本
2014/09/25 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
南京导游词
2015/02/03 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
活动总结书怎么写
2015/05/11 职场文书
初中家长意见
2015/06/03 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫