Tenacity文档中wait_exponential示例是否存在描述错误?
关于Tenacity中wait_exponential的间隔计算疑问解答
首先得明确Tenacity里wait_exponential的核心逻辑:它是指数增长的等待策略,和multiplier的取值无关,multiplier只是指数计算结果的一个乘数。
它的基础计算公式是:等待时长 = multiplier * (2 ** 重试次数)
(重试次数从0开始计数)
同时还会受到min和max参数的限制:
- 如果计算出的时长小于
min,就用min的值 - 如果计算出的时长大于
max,就用max的值
回到你贴的示例代码:
@retry(wait=wait_exponential(multiplier=1, min=4, max=10)) def wait_exponential_1(): print("Wait 2^x * 1 second between each retry starting with 4 seconds, then up to 10 seconds, then 10 seconds afterwards") raise Exception
我们来拆解实际的等待间隔:
- 第1次重试(重试次数0):
1*(2^0)=1秒→ 小于设置的min=4,所以取4秒 - 第2次重试(重试次数1):
1*(2^1)=2秒→ 还是小于4,继续取4秒 - 第3次重试(重试次数2):
1*(2^2)=4秒→ 等于min,取4秒 - 第4次重试(重试次数3):
1*(2^3)=8秒→ 介于4和10之间,取8秒 - 第5次及之后重试:
1*(2^4)=16秒→ 大于max=10,所以固定取10秒
你觉得“multiplier为1应该线性增长”是误解了这个参数的作用——线性增长是每次增加固定值(比如每次加1秒),但wait_exponential从设计上就是指数增长模式,multiplier只是用来缩放指数结果的系数,不会改变增长的类型。示例里的说明“2^x *1秒”是指它的基础计算逻辑,只是因为设置了min=4,前几次的实际间隔被抬高到了4秒而已。
内容的提问来源于stack exchange,提问作者Rajib Deb
相关产品推荐
相关产品推荐

