python 包之 retrying 重复回调教程

一、安装

  • 循环、重复回调我们在很多场景中会用到

  • 不仅在支付场景中,我们需要通过反复的回调知道用户的支付状态

  • 还有在请求中,如果请求失败,我们需要再重新进行进行请求,防止请求异常导致数据缺失

pip install retrying

 

二、一直请求

  • 假如我们希望在代码碰到异常时,一直回调,直到成功

  • 下面方法中,我们直接访问一个未定义的变量,肯定会走下面的Exception中

  • 这个时候我们可以将这一次错误写进日志,但是让程序继续执行这个方法,直到没有异常为止

  • 因为这里模拟的是肯定有异常,所以该程序会一直返回回调,不间断的循环往复

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()

 

posted @ 2022-04-19 09:58  sunnyeden  阅读(353)  评论(0编辑  收藏  举报