Pythonretrying重試機制詳解

2022-09-24 10:48:09 字數 2753 閱讀 3075

目錄

我們在程式開發中,經常會需要請求一些外部的介面資源,而且我們不能保證每次請求一定會成功,所以這些涉及到網路請求的**片段就需要加上重試機制。下面來說一下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...