如何提升代码稳定性、健壮性?Python修饰器实现自动重试机制

在Python开发过程中,有些程序的运行可能受外部环境稳定性等因素的影响,触发一些其他异常,比如请求响应、数据库链接。由于在程序设计中难以潜在的异常考虑完全,特别是那些由于稳定性带来的异常,这时如果引入重试机制,那么我的程序健壮性得到很大提升。

什么是修饰器

装饰器本质上是Python函数,能够实现让其他函数在不需要做任何代码变动的前提下增加额外功能。

可以看出,fun_a(fun_b)的执行过程如下:

  1. 执行函数fun_a,将fun_b当作参数传进去,fun_b()本身也是对象。
  2. 执行print (fun()) 代码时,先执行了 fun_b(),然后打印’Run Function B’ , 返回 2019-06-11 21:17:27 。
  3. print(fun()) 打印了fun_b()的返回结果 2019-06-11 21:17:27 。

使用修饰器进行改造,如下:

执行fun_b相当于 fun_b = fun_a(fun_b) ,只是在定义fun_b时,在其前使用@fun_a 进行修饰。

再引入闭包进行改造,如下:

在fun_a内部的函数retry(),是如何获取fun这个参数来执行的?执行fun_a函数return的是retry这个函数,而retry并没有接受fun这个传参。这就是Python里的闭包的概念,闭包就是指运行时自带上下文的函数,如这里的retry函数,他运行的时候自带了上层函数fun_a传给他的fun这个函数,所以才可以在运行时对fun进行处理和输出。

修饰器实现重试机制

简单的重试机制实现

复杂的重试机制实现

支持重试次数和等待时间,如下:

使用 retrying 模块实现重试机制

安装

 pip install retrying

参数说明

  • stop_max_attempt_numbe: 最大的尝试次数,超过该次数就停止重试,并会抛出异常
  • stop_max_delay:设置失败重试的最大时间, 单位毫秒,超出时间,则停止重试
  • wait_fixed: 两次调用方法期间停留时长, 如果出现异常则会一直重复调用
  • wait_random_min:设置失败重试随机性间隔时间的最小时间
  • wait_random_max:设置失败重试随机性间隔时间的最大时间
  • wait_incrementing_increment: 每调用一次则会增加的时间
  • retry_on_exception: 指定异常类型,指定的异常类型会重试,不指定的类型,会直接异常退出
  • retry_on_result: 指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出
  • 使用说明

    使用@retry,通过参数设置,可以灵活地设置重试机制。

    若感兴趣, 、评论支持。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年5月11日
    下一篇 2019年5月11日

    相关推荐