retrying模块的学习

retrying模块的学习

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

安装

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

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_multiplierwait_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_delaystop_max_attempt_number配合使用,则后两者会失效

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

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

原文地址:https://www.cnblogs.com/c-x-a/p/9774698.html

时间: 2024-10-16 03:03:53

retrying模块的学习的相关文章

Spark的Rpct模块的学习

Spark的Rpct模块的学习 Spark的Rpc模块是1.x重构出来可,以前的代码中大量使用了akka的类,为了把akka从项目的依赖中移除,所有添加了该模块.先看下该模块的几个主要的类 使用EA把该模块所有的类都添加进来了 要看懂该模块还是要先了解akka,  akka有Actor和ActorRef两个类,一个用于接收消息,一个用于发送消息.正好对应该模块的RpcEndpoint和RpcEndpointRef两个类. 下面大致介绍下这几个类,附带一些scala的特性 1:RpcAddress

javascript 模块快学习

<script> var Module = (function () { var my = {}; function privateMethod() { } my.moduleProperty = 1; my.moduleMethod = function () { } return my; } ()); //为防止修改内部的变量 console.log(Module.moduleProperty);//1 Module.moduleMethod = 2; console.log(Module

AngularJs HTML DOM、AngularJS 事件以及模块的学习(5)

今天的基础就到了操作DOM,事件和模块的学习,其实我个人感觉学习起来AngularJS并没有想象中的那么的艰难,可能是因为这个太基础化吧,但是我们从初学开始就应该更加的自信一些,后来我可能会写一个小的项目来练习一下吧,但是至少现在我还不能熟练的写不出来.下面就简单的实例一下吧. 一.AngularJs HTML DOM AngularJS为HTML DOM元素的属性提供了绑定应用数据的指令. (1).ng-disabled 指令,直接绑定应用程序数据到HTML的disabled属性 在浏览器中浏

python模块的学习——base64模块

首先,对于base64模块的学习参考别人的总结: http://blog.csdn.net/wanghai__/article/details/6898032 之后,在模拟登录的过程中,需要对用户名进行加密编码,采用base64.encodestring()函数 1 def GetUserName(userName): 2 userNameTemp = urllib.quote(userName) 3 userNameEncoded = base64.encodestring(userNameT

python模块的学习

1 # time 模块 2 import time 3 print(time.time()) #当前的时间挫 4 #time.sleep(3) #休息3秒钟,这3秒cpu不工作的 5 print(time.gmtime()) #time.struct_time(tm_year=2018, tm_mon=6, tm_mday=21, tm_hour=10, tm_min=37, tm_sec=30, tm_wday=3, tm_yday=172, tm_isdst=0) 时间标准时间 UTC 英国

retrying模块的使用

安装模块:pip3 install retrying 使用方式: 使用retrying模块提供的retry模块 通过装饰器的方式使用,让装饰器的函数反复的执行 retry可以传入参数stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上线,如果每次都报错,整个函数就报错,只要中间有一个成功了的话,程序就可以继续往后面执行了 例子: from retrying import retry @retry(stop_max_attempt_number=5,wai

Python模块——loguru日志模块简单学习

Python loguru模块简单学习 首先安装模块:pip install logoru,然后引入模块: from loguru import logger 1.直接输出到console logger.debug("这是一条debug") # 2019-11-13 09:53:55.425 | DEBUG | __main__:<module>:3 - 这是一条debug 2.将日志输出到文件,(例如:下面的代码会输出到file_2019-11-13_09-55-48_2

Python模块章节学习记录

Python模块章节学习 Python里含有大量的标准模块和第三方模块,同时我们也可以自主定义模块. 1.自定义模块 自定义模块的形式为"模块名 + .py",且模块文件的扩展名必须是.py.一个模块中包含许多函数,在其他的程序中我们可以通过使用import和from--import语句导入模块. import可以一次引用多个模块,且可以将模块用as关键字进行重命名,这个对引用长名模块,可以提供便利.一旦使用import引用模块,则将该模块中的所有函数引用.from--import可以

Python中re(正则表达式)模块函数学习

今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. 方法/属性 作用 match() 决定 RE 是否在字符串刚开始的位置匹配 search() 扫描字符串,找到这个 RE 匹配的位置 findall() 找到 RE 匹配的所有子串,并把它们作为一个列表返回 finditer() 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 match() 函数只检查 RE 是否在字符串开始处匹配