详解Python如何优雅的重试

 更新时间:2023年07月21日 14:17:50   作者:Harpsichord1207  
这篇文章主要为大家介绍了Python如何优雅的重试详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

在编码中,一些涉及网络连接的代码片段经常需要重试,本文讲解了如何一步一步实现一个优雅的retry装饰器以及tenacity库的使用。

原始版本v0.0

假如有一个函数形式如下,函数有一些建立网络连接的逻辑

def f():
    # do some connections
    return 0

为了避免偶尔的网络连接失败,需要加上重试机制,那么最简单的形式就是在对应的代码片段加一个循环,循环体里使用异常捕获,连接成功时退出循环,否则就重复执行相关逻辑,此时修改之后的函数f如下

def f():
    while 1:
        try:
            # do some connections
            break
        except ConnectionError:
            continue
    return 0

装饰器版本v1.0

可以使用装饰器对代码进行抽象。例如现在有两个函数f1f2需要加上重试机制,写一个名为retry的装饰器函数,用其装饰f1f2即可。这样做避免了对老代码的修改,同时也实现了代码复用。示例如下

def retry(f):
    def wrap(*args, **kwargs):
        while 1:
            try:
                return f(*args, **kwargs)
            except ConnectionError:
                continue
    return wrap

@retry
def f1():
    # do some connections
    return 0

@retry
def f2():
    # do some other connections
    return 0

带参数的装饰器版本v1.1

v1.0的版本retry装饰器还有一些问题,假如有的函数想重试3次,有的想重试5次,重试的间隔也根据不同函数不一样,v1.0是无法实现的。此时可以借助带参数的三层装饰器,例如以下代码实现的retry装饰器,可以传入timesinterval两个参数来设定重试次数和重试间隔

def retry(times, interval):
    def decorator(f)
        def wrap(*args, **kwargs):
            while times:
                try:
                    return f(*args, **kwargs)
                except ConnectionError:
                    times -= 1
                    time.sleep(interval)
                    continue
        return wrap
    return decorator

# 重试3次每次间隔10秒
@retry(times=3, interval=10)
def f1():
    # do some connections
    return 0

# 重试5次每次间隔15秒
@retry(times=5, interval=15)
def f2():
    # do some other connections
    return 0

装饰器支持参数之后,可以根据需要定义更丰富的参数,比如通过参数来设定需要捕获哪些异常等。

tenacity版本

tenacity是一个第三方开源库,用于函数的重试,实际上它的功能与原理是上面自己写的代码类似的!只是它可定义的参数更丰富,如果不想重复造轮子,拿来直接用就可以。代码示例如下

from tenacity import retry, stop_after_attempt, wait_fixed

# 不带任何参数的重试
@retry
def f():
    # do some connections
    return 0

# 重试5次每次间隔15秒
@retry(stop=stop_after_attempt(5), wait=wait_fixed(15))
def f():
    # do some connections
    return 0

以上就是详解Python如何优雅的重试的详细内容,更多关于Python优雅重试的资料请关注脚本之家其它相关文章!

相关文章

  • Python对list列表进行去重的几种方法

    Python对list列表进行去重的几种方法

    python 列表就是我们js中的数组了,我们下文整理几个常用的python 列表去重实现方法,非常的简单好用,通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-10-10
  • python如何实现图片转文字

    python如何实现图片转文字

    这篇文章主要介绍了python如何实现图片转文字问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • python微信跳一跳系列之棋子定位像素遍历

    python微信跳一跳系列之棋子定位像素遍历

    这篇文章主要为大家详细介绍了python微信跳一跳系列之棋子定位之像素遍历,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 人工智能学习PyTorch实现CNN卷积层及nn.Module类示例分析

    人工智能学习PyTorch实现CNN卷积层及nn.Module类示例分析

    这篇文章主要为大家介绍了人工智能学习PyTorch实现CNN卷积层及nn.Module类示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • 详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法

    详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法

    这篇文章主要介绍了详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python最常用的三种输出格式解读

    python最常用的三种输出格式解读

    这篇文章主要介绍了python最常用的三种输出格式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python Excel处理库openpyxl详解

    Python Excel处理库openpyxl详解

    这篇文章主要介绍了Python Excel处理库openpyxl详解,需要的朋友可以参考下
    2021-05-05
  • 如何利用Python实现简单C++程序范围分析

    如何利用Python实现简单C++程序范围分析

    这篇文章主要介绍了如何利用Python实现简单C++程序范围分析,文章以举例说明及过程实现思路的方式展开讲解,具有一定的的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02
  • Python3.8中使用f-strings调试

    Python3.8中使用f-strings调试

    这篇文章主要介绍了Python3.8中使用f-strings调试的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python实现二叉堆

    Python实现二叉堆

    二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。
    2016-02-02

最新评论