我们经常在开发中会遇到这样一种场景,即轮循操作。今天介绍一个Python库,用于更方便的达到轮循的乐动体育效果——backoff。
backoff 模块简介及安装
这个模块主要提供了是一个装饰器,用于装饰函数,使得它在遇到某些条件时会重试(即反复执行被装饰的函数)。通常适用于我们在获取一些不可靠资源,比如会间歇性故障的资源等。
此外,装饰器支持正常的同步方法,也支持异步asyncio代码。
backoff 模块的安装也很简单,通过 pip 即可安装完成:
pip install backoff
backoff 用法及简单源码分析
backoff 提供两个主要的装饰器,通过 backoff. 调用,通过提示我们可以看到这两个装饰器,分别是:
backoff.on_predicatebackoff.on_exception
通过 github 查看 backoff 的源码,源码目录 backoff/_decorator.py,定义如下:
def on_predicate(wait_gen, predicate=operator.not_, max_tries=None, max_time=None, jitter=full_jitter, on_success=None, on_backoff=None, on_giveup=None, logger=‘backoff’,
**wait_gen_kwargs):
省略具体代码
每个参数的定义在源码中都给出了明确的解释
pass
def on_exception(wait_gen,
exception, max_tries=None, max_time=None, jitter=full_jitter, giveup=lambda e: False, on_success=None, on_backoff=None, on_giveup=None, logger=‘backoff’,
**wait_gen_kwargs):
省略具体代码
每个参数的定义在源码中都给出了明确的解释
pass
可以看到,定义了很多的参数,这些参数在源码中都给出了比较详细的解释,这里做简单的介绍:
首先,wait_gen:表示每次循环等待的时长,以秒为单位。它的类型是一个生成器,在 backoff 中内置了三个生成器。我们查看下源码,目录为 backoff/_wait_gen.py。我们取其中一个的详细实现来看下:
省略实现代码# base * factor * ndef expo(base=2, factor=1, max_value=None):
“”“Generator for exponential decay.
Args:
base: The mathematical base of the exponentiation operation
factor: Factor to multiply the exponentation by.
max_value: The maximum value to yield. Once the value in the
true exponential sequence exceeds this, the value
of max_value will forever after be yielded.
“””
n = 0
while True:
a = factor * base ** n if max_value is None or a < max_value: yield a
n += 1
else: yield max_value# 通过斐波那契数列控制def fibo(max_value=None):
pass# 常量数值def constant(interval=1):
pass
从源码不难看出,通过一些策略,每次 yield 返回不同的数值,这些数值就是重试等待秒数。当然因为这个参数类型是生成器,显然我们也是可以自定义的。同时我们会发现每个 wait_gen 都是参数控制的,所以我们理应是可以修改这个参数的初始值的。
显然,wait_gen_kwargs就是用来传递这些参数的,它是通