Python retrying库重试机制详解:从无限重试到高级过滤
本文详细介绍Python中retrying库的核心功能,涵盖无限重试、最大尝试次数、时间延迟、随机与指数间隔等策略。同时解析如何指定异常类型、基于结果过滤重试以及配置自定义停止函数,帮助开发者构建稳健的异步请求与支付回调系统。
一、安装
- 循环与重复回调机制在多种业务场景中至关重要。
- 例如在支付系统中,系统需要持续发起回调请求以确认用户的最终支付状态。
- 此外,在网络请求中,若首次请求失败,通过重试机制重新发起请求可有效防止因网络异常导致的数据丢失。
pip install retrying二、一直请求
- 若希望代码在遇到异常时持续重试,直至操作成功,可采用以下策略。
- 示例代码中直接访问未定义的变量,必然触发异常处理分支。
- 此时可将错误信息写入日志,但让程序继续执行该方法,直到不再抛出异常为止。
- 由于此处模拟的是必然失败的异常,程序将无限次循环执行回调操作。
from retrying import retry
@retry()
def say():
try:
autofelix
except Exception as e:
# 可以将错误记录日志
print(e)
raise
say()三、设置最大运行次数
- 当请求过程中遇到异常时,
- 可通过 stop_max_attempt_number 参数设定最大重试次数。
- 一旦重试次数超过设定值,系统将停止重试并抛出最终异常。
- 示例中将最大运行次数设置为5次。
from retrying import retry
@retry(stop_max_attempt_number=5)
def say():
try:
autofelix
except Exception as e:
# 可以将错误记录日志
print(e)
raise
say()四、设置重试的最大时间
- 可以通过
stop_max_delay参数设置失败重试的最大时间,单位为毫秒。 - 当累计重试时间超出该限制时,系统将停止重试。
from retrying import retry
@retry(stop_max_delay=1000)
def say():
try:
autofelix
except Exception as e:
# 可以将错误记录日志
print(e)
raise
say()五、设置间隔时间
- 此参数用于设置失败重试之间的固定间隔时间,单位为毫秒。
- 合理设置可有效降低高频回调对服务器的压力。
from retrying import retry
@retry(wait_fixed=1000)
def say():
try:
autofelix
except Exception as e:
# 可以将错误记录日志
print(e)
raise
say()六、设置随机间隔时间
- 通过配置失败重试的随机间隔时间(单位毫秒),
- 可使访问频率呈现不均匀分布,避免集中请求。
from retrying import retry
@retry(wait_random_min=5000, wait_random_max=50000)
def say():
try:
autofelix
except Exception as e:
# 可以将错误记录日志
print(e)
raise
say()七、随机倍数间隔时间
- 可以通过设置
wait_exponential_multiplier参数使间隔时间按倍数增加。 - 同时可通过设置
wait_exponential_max参数限制最大间隔时间。
from retrying import retry
@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
def say():
try:
autofelix
except Exception as e:
# 可以将错误记录日志
print(e)
raise
say()八、指定异常类型
- 可以通过
retry_on_exception参数指定需要重试的异常类型。 - 仅指定的异常类型会触发重试,未指定的类型将直接导致程序异常退出。
- 若设置
wrap_exception参数为True,则其他类型异常
from retrying import retry
def retry_error(exception):
return isinstance(exception, RetryError)
# 会重复调用
@retry(etry_on_exception=retry_error)
def say():
try:
autofelix
except RetryError as e:
raise RetryError
# 只调用一次
@retry(etry_on_exception=retry_error, wrap_exception=True)
def say():
raise Exception('a')
say()九、过滤回调
- 可以设置
retry_on_result参数指定哪些返回结果需要触发重试。 - 将请求结果传入
retry_on_result指定的过滤方法,若该方法返回None,则继续重试;否则结束重试。
from retrying import retry
def retry_filter(result):
print("this is result")
return result is not None
@retry(retry_on_result=retry_filter)
def say():
print('Retry forever ignoring Exceptions with no wait if return value is None')
return None
say()十、异常执行
- 通过设置
stop_func参数,可在每次抛出异常时执行指定的回调函数。 - 若同时使用了
stop_max_delay或stop_max_attempt_number参数,则后两者的限制条件将失效。
from retrying import retry
def stop_record(attempts, delay):
print("logging %d--->%d" % (attempts,delay))
@retry(stop_max_delay=10, stop_func=stop_record)
def say():
print("i am autofelix")
raise Exception
say()到此这篇关于python 包之 retrying 重复回调的文章就介绍到这了,更多相关python retrying 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









