首頁 > 軟體

python包中的 retrying 重複回撥

2022-04-19 13:01:14

一、安裝

  • 迴圈、重複回撥我們在很多場景中會用到
  • 不僅在支付場景中,我們需要通過反覆的回撥知道使用者的支付狀態
  • 還有在請求中,如果請求失敗,我們需要再重新進行進行請求,防止請求異常導致資料缺失
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_delaystop_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 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com