一、安装
循环、重复回调我们在很多场景中会用到
不仅在支付场景中,我们需要通过反复的回调知道用户的支付状态
还有在请求中,如果请求失败,我们需要再重新进行进行请求,防止请求异常导致数据缺失

  1. pip install retrying

二、一直请求
假如我们希望在代码碰到异常时,一直回调,直到成功
下面方法中,我们直接访问一个未定义的变量,肯定会走下面的Exception中
这个时候我们可以将这一次错误写进日志,但是让程序继续执行这个方法,直到没有异常为止
因为这里模拟的是肯定有异常,所以该程序会一直返回回调,不间断的循环往复

  1. from retrying import retry
  2. @retry()
  3. def say():
  4. try:
  5. autofelix
  6. except Exception as e:
  7. # 可以将错误记录日志
  8. print(e)
  9. raise
  10. say()

三、设置最大运行次数
如果我们在请求中遇到异常时候
可以通过 stop_max_attempt_number 设置一个最大运行次数
当回调次数超过设置值,将不再执行回调
这里我们设置最大运行次数为5次

  1. from retrying import retry
  2. @retry(stop_max_attempt_number=5)
  3. def say():
  4. try:
  5. autofelix
  6. except Exception as e:
  7. # 可以将错误记录日志
  8. print(e)
  9. raise
  10. say()

四、设置重试的最大时间
可以通过 stop_max_delay 设置失败重试的最大时间, 单位毫秒
超出时间,则停止重试

  1. from retrying import retry
  2. @retry(stop_max_delay=1000)
  3. def say():
  4. try:
  5. autofelix
  6. except Exception as e:
  7. # 可以将错误记录日志
  8. print(e)
  9. raise
  10. say()

五、设置间隔时间
设置失败重试的间隔时间, 单位毫秒
降低回调频率

  1. from retrying import retry
  2. @retry(wait_fixed=1000)
  3. def say():
  4. try:
  5. autofelix
  6. except Exception as e:
  7. # 可以将错误记录日志
  8. print(e)
  9. raise
  10. say()

六、设置随机间隔时间
设置失败重试随机性间隔时间, 单位毫秒
可以使得访问频率不均匀

  1. from retrying import retry
  2. @retry(wait_random_min=5000, wait_random_max=50000)
  3. def say():
  4. try:
  5. autofelix
  6. except Exception as e:
  7. # 可以将错误记录日志
  8. print(e)
  9. raise
  10. say()

七、随机倍数间隔时间
可以通过设置 wait_exponential_multiplier 间隔时间倍数增加
可以通过设置 wait_exponential_max 最大间隔时间

  1. from retrying import retry
  2. @retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
  3. def say():
  4. try:
  5. autofelix
  6. except Exception as e:
  7. # 可以将错误记录日志
  8. print(e)
  9. raise
  10. say()

八、指定异常类型
可以通过 retry_on_exception 设置指定异常类型
指定的异常类型会重试,不指定的类型,会直接异常退出
如果设置 wrap_exception 参数为True,则其他类型异常

  1. from retrying import retry
  2. def retry_error(exception):
  3. return isinstance(exception, RetryError)
  4. # 会重复调用
  5. @retry(etry_on_exception=retry_error)
  6. def say():
  7. try:
  8. autofelix
  9. except RetryError as e:
  10. raise RetryError
  11. # 只调用一次
  12. @retry(etry_on_exception=retry_error, wrap_exception=True)
  13. def say():
  14. raise Exception('a')
  15. say()

九、过滤回调
可以设置 retry_on_result 指定哪些结果需要去回调
将请求结果放到 retry_on_result 指定方法中进行过滤,如果返回None,则继续回调,否则就结束

  1. from retrying import retry
  2. def retry_filter(result):
  3. print("this is result")
  4. return result is not None
  5. @retry(retry_on_result=retry_filter)
  6. def say():
  7. print('Retry forever ignoring Exceptions with no wait if return value is None')
  8. return None
  9. say()

十、异常执行
通过设置 stop_func 每次抛出异常时都会执行的函数
如果和stop_max_delay、stop_max_attempt_number配合使用,则后两者会失效

  1. from retrying import retry
  2. def stop_record(attempts, delay):
  3. print("logging %d--->%d" % (attempts,delay))
  4. @retry(stop_max_delay=10, stop_func=stop_record)
  5. def say():
  6. print("i am autofelix")
  7. raise Exception
  8. say()

更多相关文章

  1. Android开发工具全面转向Android(安卓)Studio(1)——准备开发环
  2. Android线程优先级设置方法
  3. android 创建自定义模态框
  4. android:maxHeight,android:maxWidth失效
  5. Android预定义样式?android:attr/attribute、?attr/attribute和?
  6. android之CalendarView日历视图
  7. Android上鲜为人知的UI控件介绍和使用
  8. intellij idea 设置用真机测试android
  9. android Dependencies ,Private Libraries ,Referenced Libraries

随机推荐

  1. Android(安卓)Studio SVN版本控制
  2. 第六章、android的Drawable
  3. Android(安卓)Studio在创建/导入项目的时
  4. Android更新UI的两种方法(一)
  5. Android显示音标 [ɪmˈpɪəri:əs]
  6. Android(安卓)主流屏幕以及适配
  7. Android和IOS等效MD5加密
  8. Android手机蓝牙实现多人即时聊天
  9. Android中程序与Service交互的方式——综
  10. Android学习笔记17:中级视图组件DatePicke