retry模块是需要额外的安装包。
1. 基本功能
该模块主要用于多次尝试某一函数。本质上就是一个封装了的装饰器。
1.1 装饰器retry
1.1.1 导入
from retry import retry
# 或者
from retry.api import retry
1.1.2 函数说明
retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger)
-
exceptions: 获取报错的类型
-
logger: 答应日志的logger
-
tries: 重复尝试的次数。
- 默认-1,代表无穷次
-
delay: 重复尝试之间的时间间隔。
- 默认为0,代表没有间隔
-
backoff: 重复尝试之间间隔时间的乘子,即前一次是后一次的多少倍
- 默认为1,代表后一次的时间间隔与前一次的时间间隔一样。
-
jitter: 重复尝试之间间隔时间增加量,即前一次是后一次多的时间
- 默认为0,代表后一次的时间间隔与前一次的时间间隔一样。
- 给数值时,则增加该数值
- 若给的是二维tuple,则增加至为范围内的随机数
-
max_delay: 重复尝试之间间隔时间的最大值
- 默认为None,即无穷大
-
说明:
- 关于重复尝试之间的时间间隔公式如下:
d ( n ) :代表第n次结束之后的间隔时间 d ( 1 ) = d e l a y d ( n + 1 ) = min ( d ( n ) ∗ b a c k o f f + j i t t e r , m a x _ d e l a y ) d(n) \text{:代表第n次结束之后的间隔时间} \\ d(1) = delay \\ d(n+1) = \min(d(n)*backoff+jitter, max\_delay) d(n):代表第n次结束之后的间隔时间d(1)=delayd(n+1)=min(d(n)∗backoff+jitter,max_delay)
- 关于重复尝试之间的时间间隔公式如下:
1.1.3 函数测试
@retry((ValueError, TypeError), tries=8, delay=0.1, backoff=2, jitter=0.1, max_delay=1)
def make_trouble():
"""
Retry on ValueError or TypeError, sleep 0.1, 0.3, 0.7, 1, 1, ... seconds between attempts.
"""
print(1, time.time())
raise ValueError('a')
if __name__ == '__main__':
make_trouble()