资讯专栏INFORMATION COLUMN

Python之retrying

马龙驹 / 1629人阅读

摘要:是一个很好用的关于重试的包,可以用来自动重试一些可能会运行失败的程序段。就是一个可以用来应对上述问题的工具,可以在上获得。这个设计迎合了算法,可以减轻阻塞的情况。

retrying是一个很好用的关于重试的Python包,可以用来自动重试一些可能会运行失败的程序段。

为什么选择retrying

我们在写一些程序的时候,会去调用一些外部资源、组件,这些外部程序对我们来说是不可控的,所以它们不可用、运行失败都是正常的事情,尤其是在网络上多个服务交互的时候,在写程序的时候一定要考虑调用外部程序会失败的情况。

retrying

retrying就是一个可以用来应对上述问题的工具,可以在PyPi上获得。
retrying提供一个装饰器函数retry,被装饰的函数就会在运行失败的条件下重新执行,默认只要一直报错就会不断重试,看一下下面的例子:

import random
from retrying import retry

@retry
def have_a_try():
    if random.randint(0, 10) != 5:
        raise Exception("It"s not 5!")
    print "It"s 5!"

如果我们运行have_a_try函数,那么直到random.randint返回5,它才会执行结束,否则会一直重新执行。
retry还可以接受一些参数,这个从源码中Retrying类的初始化函数可以看到可选的参数:

    def __init__(self,
                 stop=None, wait=None,
                 stop_max_attempt_number=None,
                 stop_max_delay=None,
                 wait_fixed=None,
                 wait_random_min=None, wait_random_max=None,
                 wait_incrementing_start=None, wait_incrementing_increment=None,
                 wait_exponential_multiplier=None, wait_exponential_max=None,
                 retry_on_exception=None,
                 retry_on_result=None,
                 wrap_exception=False,
                 stop_func=None,
                 wait_func=None,
                 wait_jitter_max=None)

stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试

stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了

wait_fixed:设置在两次retrying之间的停留时间

wait_random_minwait_random_max:用随机的方式产生两次retrying之间的停留时间

wait_exponential_multiplierwait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max。这个设计迎合了exponential backoff算法,可以减轻阻塞的情况。

我们可以指定要在出现哪些异常的时候再去retry,这个要用retry_on_exception传入一个函数对象:

def retry_if_io_error(exception):
    return isinstance(exception, IOError)

@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
    with open("file", "r") as f:
        return f.read()

在执行read_a_file函数的过程中,如果报出异常,那么这个异常会以形参exception传入retry_if_io_error函数中,如果exceptionIOError那么就进行retry,如果不是就停止运行并抛出异常。

我们还可以指定要在得到哪些结果的时候去retry,这个要用retry_on_result传入一个函数对象:

def retry_if_result_none(result):
    return result is None

@retry(retry_on_result=retry_if_result_none)
def get_result():
    return None

在执行get_result成功后,会将函数的返回值通过形参result的形式传入retry_if_result_none函数中,如果返回值是None那么就进行retry,否则就结束并返回函数值。

参考资料

Get back up and try again: retrying in Python

retrying

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37650.html

相关文章

  • 如何实现一个Python爬虫框架

    摘要:这篇文章的题目有点大,但这并不是说我自觉对爬虫这块有多大见解,我只不过是想将自己的一些经验付诸于笔,对于如何写一个爬虫框架,我想一步一步地结合具体代码来讲述如何从零开始编写一个自己的爬虫框架年到如今,我花精力比较多的一个开源项目算是了,这是 showImg(https://segmentfault.com/img/remote/1460000018513379); 这篇文章的题目有点大...

    feng409 评论0 收藏0
  • Python重试机制是什么,下文给大家解答

      小编写这篇文章的主要目的,主要是给大家讲解一下,关于Python机制的一些问题,比如重新调试的机制是什么呢?应用到它的场景还是很多的,下面跟小编一块去学习吧。  介绍:  为了避免网络问题出现的错误,比如网络延迟或者是宕机,往往都会出现请求超时的问题。  这里要给大家介绍的是一个第三方库-Tenacity(标题中的重试机制并并不准确,它不是Python的内置模块,因此并不能称之为机制),它实现...

    89542767 评论0 收藏0
  • 解决树莓派下载django的TypeError:..... Retry and int 问题

    摘要:没报错但依然无法安装使用再次安装无果感谢大神的分享我才发觉这是一个新手的通用问题树莓派自带的系统附带了一个来自前寒武纪的版本,如果您不想花费数小时来调试与相关的问题,那么就必须升级它。 诸位, 不好意思哈, 请允许我把完整的标题写完(标题不能超过64个有效字符): 记一次解决树莓派下载Django库 ——报错为TypeError: unsupported operand types f...

    TalkingData 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<