目錄
我們在程式開發中,經常會需要請求一些外部的介面資源,而且我們不能保證每次請求一定會成功,所以這些涉及到網路請求的**片段就需要加上重試機制。下面來說一下python中的重試方法。
最簡單的重試方式就是在需要進行重試的**片段上加乙個迴圈,程式內捕獲異常,如果執行成功就退出迴圈,執行失敗就就重複執行相關**,例如:
import requests
def req_with_retry(url):
retry_max = 10 # 最大重試次數為10次
for i in range(1, retry_max+1):
try:
print("第{}次請求".format(i))
# 這裡請求不到會拋connecttimeout異常
res = requests.get(url, timeout=1)
data = res.json()
print("請求成功:", data)
break
except requests.exceptions.connecttimeout as e:
continue
# 請求乙個不存在的**
req_with_retry(
執行結果:
由於請求了乙個不存在的**,所以一直在重試,知道達到最大次數10次。但是這樣有一定的**侵入性,在業務邏輯上加入迴圈判斷顯得很不美觀,別著急,往下看,還有更好的方法。
retrying是python的乙個第三方庫,它提供乙個裝飾器函式retry,被裝飾的業務函式就會在執行失敗的條件下重新執行,預設只要報錯就會一直重試,直至執行成功。
可以使用pip install retrying進行安裝。
例如下面一段**,我們使用生成隨機數的大小的方式模擬業務的成功與失敗,只要是生成的隨機數大於2,都視為失敗,就會重試,直到生成的隨機數小於2:
import random
from retrying import retry
@retry
def random_with_retry():
if random.randi程式設計客棧nt(0, 10) > 2:
print("大於2,重試...")
raise exception("大於2")
print("小於2,成功!")
random_with_retry()
執行結果如下:
retry還可以接受一些引數,下面是原始碼中retrying類的初始化函式中可選的引數:
stop_max_attempt_number:最大重試次數,超過該次數就停止重試
stop_max_delay:最大延遲時間(執行這個方法重試的總時間),超過該時間就停止
wait_fixed:兩次retrying之間的等待時間
wait_random_min和wait_random_max:用隨機的方式產生兩次retrying之間的等待時間
wait_incrementing_start和wait_incrementing_increment:每呼叫一次增加固定時長
wait_exponential_multiplier和wait_exponential_max:以指數的形式產生兩次retryin程式設計客棧g之間的等待時間,產生的值為2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已經retry的次數,如果產生的這個值超過了wait_exponential_max的大小,那麼之後兩個retrying之間的停留值都為wait_exponential_max。
特別需要注意的是retry_on_exception引數,它接收乙個函式,用法如下:
# 判斷異常
def is_myerror(exception):
print("判斷異常", exception)
print(isinstance(exception, (valueerror, ioerror, connectionerror)))
return isinstance(exception, (valueerror, ioerror, connectionerror))
@retry(retry_on_exception=is_myerror)
def random_with_retry():
"""隨機乙個0-10之前的整數,大於2拋異常,小於2成功
:return:
"""if random.randint(0, 10) > 2:
print("大於2,重試...")
raise valueerror("大於2")
print("小於2,成功!")
random_with_retry()
這裡retry_on_exception引數的大體思想是:接收乙個自定義函式is_myerror,在is_myerror函式裡判斷了是不是屬於valueerror,程式設計客棧ioerror,connectionerror這三種異常;random_with_retry()函式如果丟擲了異常,會去函式is_myerror()判斷返回的是true還是false,如果是true則繼續重試,如果是false則立即停止並丟擲異程式設計客棧常。
還有retry_on_result引數,也是接收乙個函式,判斷業務函式返回哪些結果時需要重試,思想和retry_on_exception引數類似。
我們可以根據自己的需要進行合理的搭配這些引數,達到我們想要的效果。
本文標題: pythonretrying重試機制詳解
本文位址: /jiaoben/python/440847.html
重發布 重分布 重分發
asbr同時工作於不同的路由協議中,然後通過各種的方式學習條目,然後在進行共享 1,必須存在asbr 自治系統邊界路由器 協議邊界路由器 2,需要考慮種子度量 規則 1 a協議發布到b協議,在asbr上的b協議中配置 2 將a協議發布到b協議,是將asbr上通過a協議學習,及本地工作於a的直連全部發...
c 中的重定義,重包含。
1.重定義的概念 乙個變數被直接或者間接多次定義導致的錯誤 導致重定義的三種情況 第一種 就是同乙個變數多次在乙個檔案中定義,例如 int a 1 int a 2 a就是 重定義 第二種 由於重複包含標頭檔案導致的變數的重定義,例如在a.h中定義了乙個變數 int a 3 後來b.h包含了a.h,並...
count去重和distinct去重
有兩種去重方法 1 select count distinct id from a 這個是將所有值都放入到記憶體中,key為列值,通過hash算出有多少個key就是多少行。2 select count 1 from select 1 from a group by id a,這個是通過group b...