前言在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等 。这些不确定性会让我们的程序容易出现各种错误和异常 。那么如何来增加程序的容错性和健壮性呢?
可能大多数人会想到使用try except来进行异常捕捉进行失败重试(Retry) 。虽然try-escept一个非常常见和有效的方式来增强程序稳定性,但是可能一不小心就会造成栈溢出 。
所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying 。
文章插图
定义在Python/ target=_blank class=infotextkey>Python生态中,retrying库提供了非常便捷的装饰器和函数来帮助我们轻松添加失败重试机制 。它可以自定义重试策略、停止条件、等待间隔等,对各种异常进行捕捉处理 。使用retrying可以大大减少我们重复编写失败重试轮询的代码量 。
1.下载retrying
pip install retrying
- 1.
import retrying@retrydef func():for item in range(0,100):result=item / 0print(result)return resultfunc()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
所以我们在进行失败重试的时候最好是需要加上一些参数来限制失败重试 。
3.有参数重试(1) stop_max_attempt_number
在retry中传入stop_max_attempt_number参数后可以指定失败重试的次数
@retry(stop_max_attempt_number=2)def func():print(f"记录失败重试")for item in range(0,100):result=item / 0print(result)return resultfunc()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
文章插图
(2) wAIt_fixed传入wati_fixed后,可以指定重试的时间
from retrying import retryimport time# 设置三秒重试一次@retry(wait_fixed=3000)def func():print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))result=1 / 0print(result)return resultfunc()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
文章插图
配置重试间隔时间后,成语遇到执行失败或者报错后,就会根据设置的重试时间去进行重试执行
(3) wait_random_min和wait_random_max
通常wait_random_min和wait_random_max是一起搭配使用的,可以设置一个重试等待的时间,然后会在设置的时间区间内随机取一个等待时间进行重试
from retrying import retryimport time@retry(wait_random_min=1000,wait_random_max=9000)def func():print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))result=1 / 0print(result)return resultfunc()
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
文章插图
(4) 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
通俗来点讲就是每次重试的时间以wait_exponential_multiplier设置的值2,如果重试后还是失败则继续2,直到最后的值等于或则超过wait_exponential_max设置的值后,后面的每一次重试等待时间都是wait_exponential_max设置的值