python重試裝飾器的簡(jiǎn)單實(shí)現(xiàn)方法
簡(jiǎn)單實(shí)現(xiàn)了一個(gè)在函數(shù)執(zhí)行出現(xiàn)異常時(shí)自動(dòng)重試的裝飾器,支持控制最多重試次數(shù),每次重試間隔,每次重試間隔時(shí)間遞增。
最新的代碼可以訪問從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: PyCharm
import time
from functools import wraps
__author__ = 'blackmatrix'
"""
在函數(shù)執(zhí)行出現(xiàn)異常時(shí)自動(dòng)重試的簡(jiǎn)單裝飾器
"""
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):
"""
函數(shù)執(zhí)行出現(xiàn)異常時(shí)自動(dòng)重試的簡(jiǎn)單裝飾器。
:param max_retries: 最多重試次數(shù)。
:param delay: 每次重試的延遲,單位秒。
:param step: 每次重試后延遲遞增,單位秒。
:param exceptions: 觸發(fā)重試的異常類型,單個(gè)異常直接傳入異常類型,多個(gè)異常以tuple或list傳入。
:param sleep: 實(shí)現(xiàn)延遲的方法,默認(rèn)為time.sleep。
在一些異步框架,如tornado中,使用time.sleep會(huì)導(dǎo)致阻塞,可以傳入自定義的方法來實(shí)現(xiàn)延遲。
自定義方法函數(shù)簽名應(yīng)與time.sleep相同,接收一個(gè)參數(shù),為延遲執(zhí)行的時(shí)間。
:param callback: 回調(diào)函數(shù),函數(shù)簽名應(yīng)接收一個(gè)參數(shù),每次出現(xiàn)異常時(shí),會(huì)將異常對(duì)象傳入。
可用于記錄異常日志,中斷重試等。
如回調(diào)函數(shù)正常執(zhí)行,并返回True,則表示告知重試裝飾器異常已經(jīng)處理,重試裝飾器終止重試,并且不會(huì)拋出任何異常。
如回調(diào)函數(shù)正常執(zhí)行,沒有返回值或返回除True以外的結(jié)果,則繼續(xù)重試。
如回調(diào)函數(shù)拋出異常,則終止重試,并將回調(diào)函數(shù)的異常拋出。
:param validate: 驗(yàn)證函數(shù),用于驗(yàn)證執(zhí)行結(jié)果,并確認(rèn)是否繼續(xù)重試。
函數(shù)簽名應(yīng)接收一個(gè)參數(shù),每次被裝飾的函數(shù)完成且未拋出任何異常時(shí),調(diào)用驗(yàn)證函數(shù),將執(zhí)行的結(jié)果傳入。
如驗(yàn)證函數(shù)正常執(zhí)行,且返回False,則繼續(xù)重試,即使被裝飾的函數(shù)完成且未拋出任何異常。
如回調(diào)函數(shù)正常執(zhí)行,沒有返回值或返回除False以外的結(jié)果,則終止重試,并將函數(shù)執(zhí)行結(jié)果返回。
如驗(yàn)證函數(shù)拋出異常,且異常屬于被重試裝飾器捕獲的類型,則繼續(xù)重試。
如驗(yàn)證函數(shù)拋出異常,且異常不屬于被重試裝飾器捕獲的類型,則將驗(yàn)證函數(shù)的異常拋出。
:return: 被裝飾函數(shù)的執(zhí)行結(jié)果。
"""
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)
# 驗(yàn)證函數(shù)返回False時(shí),表示告知裝飾器驗(yàn)證不通過,繼續(xù)重試
if callable(validate) and validate(result) is False:
continue
else:
return result
except exceptions as ex:
# 回調(diào)函數(shù)返回True時(shí),表示告知裝飾器異常已經(jīng)處理,終止重試
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 wrapper
if __name__ == '__main__':
pass
以上這篇python重試裝飾器的簡(jiǎn)單實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 爬取國(guó)內(nèi)小說網(wǎng)站
國(guó)內(nèi)小說網(wǎng)站的結(jié)構(gòu),大概都如出一轍,改改地址,就差不多了,有此需求的朋友可以參考下本文的爬蟲寫法2021-06-06
Python中Celery異步任務(wù)隊(duì)列的具體使用
Celery是一個(gè)用于處理分布式任務(wù)和作業(yè)隊(duì)列的異步任務(wù)隊(duì)列庫,本文主要介紹了Python中Celery異步任務(wù)隊(duì)列的具體使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
python3從網(wǎng)絡(luò)攝像機(jī)解析mjpeg http流的示例
這篇文章主要介紹了python3從網(wǎng)絡(luò)攝像機(jī)解析mjpeg http流的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
用Q-learning算法實(shí)現(xiàn)自動(dòng)走迷宮機(jī)器人的方法示例
這篇文章主要介紹了用Q-learning算法實(shí)現(xiàn)自動(dòng)走迷宮機(jī)器人的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
如何利用Python實(shí)現(xiàn)簡(jiǎn)易的音頻播放器
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)簡(jiǎn)易的音頻播放器,需要用到的庫有pygame和tkinter,實(shí)現(xiàn)音頻播放的功能,供大家學(xué)習(xí)參考,希望對(duì)你有所幫助2022-03-03
python使用UDP實(shí)現(xiàn)客戶端和服務(wù)器對(duì)話
這篇文章主要為大家介紹了python使用UDP實(shí)現(xiàn)客戶端和服務(wù)器對(duì)話示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

