国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python重試裝飾器的簡單實現方法

2020-02-16 01:00:55
字體:
來源:轉載
供稿:網友

簡單實現了一個在函數執(zhí)行出現異常時自動重試的裝飾器,支持控制最多重試次數,每次重試間隔,每次重試間隔時間遞增。

最新的代碼可以訪問從github上獲取

https://github.com/blackmatrix7/matrix-toolkit/blob/master/toolkit/retry.py

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2017/8/18 上午9:50# @Author : Matrix# @Github : https://github.com/blackmatrix7/# @Blog : http://www.cnblogs.com/blackmatrix/# @File : retry.py# @Software: PyCharmimport timefrom functools import wraps__author__ = 'blackmatrix'"""在函數執(zhí)行出現異常時自動重試的簡單裝飾器"""class StopRetry(Exception): def __repr__(self):  return 'retry stop'def retry(max_retries: int =5, delay: (int, float) =0, step: (int, float) =0,   exceptions: (BaseException, tuple, list) =BaseException,   sleep=time.sleep, callback=None, validate=None): """ 函數執(zhí)行出現異常時自動重試的簡單裝飾器。 :param max_retries: 最多重試次數。 :param delay: 每次重試的延遲,單位秒。 :param step: 每次重試后延遲遞增,單位秒。 :param exceptions: 觸發(fā)重試的異常類型,單個異常直接傳入異常類型,多個異常以tuple或list傳入。 :param sleep: 實現延遲的方法,默認為time.sleep。 在一些異步框架,如tornado中,使用time.sleep會導致阻塞,可以傳入自定義的方法來實現延遲。 自定義方法函數簽名應與time.sleep相同,接收一個參數,為延遲執(zhí)行的時間。 :param callback: 回調函數,函數簽名應接收一個參數,每次出現異常時,會將異常對象傳入。 可用于記錄異常日志,中斷重試等。 如回調函數正常執(zhí)行,并返回True,則表示告知重試裝飾器異常已經處理,重試裝飾器終止重試,并且不會拋出任何異常。 如回調函數正常執(zhí)行,沒有返回值或返回除True以外的結果,則繼續(xù)重試。 如回調函數拋出異常,則終止重試,并將回調函數的異常拋出。 :param validate: 驗證函數,用于驗證執(zhí)行結果,并確認是否繼續(xù)重試。 函數簽名應接收一個參數,每次被裝飾的函數完成且未拋出任何異常時,調用驗證函數,將執(zhí)行的結果傳入。 如驗證函數正常執(zhí)行,且返回False,則繼續(xù)重試,即使被裝飾的函數完成且未拋出任何異常。 如回調函數正常執(zhí)行,沒有返回值或返回除False以外的結果,則終止重試,并將函數執(zhí)行結果返回。 如驗證函數拋出異常,且異常屬于被重試裝飾器捕獲的類型,則繼續(xù)重試。 如驗證函數拋出異常,且異常不屬于被重試裝飾器捕獲的類型,則將驗證函數的異常拋出。 :return: 被裝飾函數的執(zhí)行結果。 """ def wrapper(func):  @wraps(func)  def _wrapper(*args, **kwargs):   nonlocal delay, step, max_retries   func_ex = StopRetry   while max_retries > 0:    try:     result = func(*args, **kwargs)     # 驗證函數返回False時,表示告知裝飾器驗證不通過,繼續(xù)重試     if callable(validate) and validate(result) is False:      continue     else:      return result    except exceptions as ex:     # 回調函數返回True時,表示告知裝飾器異常已經處理,終止重試     if callable(callback) and callback(ex) is True:      return     func_ex = ex    finally:     max_retries -= 1     if delay > 0 or step > 0:      sleep(delay)      delay += step   else:    raise func_ex  return _wrapper return wrapperif __name__ == '__main__': pass            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泾川县| 屏边| 桃园县| 中西区| 宜丰县| 民权县| 辽源市| 鄢陵县| 甘泉县| 吉木乃县| 丁青县| 方城县| 那坡县| 攀枝花市| 万安县| 南充市| 林西县| 谷城县| 蒙阴县| 仁怀市| 临潭县| 安远县| 阳东县| 德江县| 麦盖提县| 屏南县| 柏乡县| 武功县| 利川市| 安图县| 陆良县| 广宁县| 岳普湖县| 济南市| 大兴区| 岳普湖县| 大方县| 佳木斯市| 姚安县| 融水| 淳化县|