(數據科學學習手札54)Python中retry的簡單用法


一、簡介

  retry是一個用於錯誤處理的模塊,功能類似try-except,但更加快捷方便,本文就將簡單地介紹一下retry的基本用法。

 

二、基本用法

retry:

  作為裝飾器進行使用,不傳入參數時功能如下例所示:

from retry import retry

@retry()
def demo():
    print('錯誤')
    raise

demo()

  我們編寫了每次運行都會通過raise報錯的自定義函數demo(),利用默認參數的retry()進行裝飾,運行結果如下:

  可以看到,retry()在這里的功能,是在其裝飾的函數運行報錯后重新運行該函數,在上例中的效果就是反復運行demo(),這也是retry()的基本用法,下面介紹其幾個主要參數:

exceptions:傳入指定的錯誤類型,默認為Exception,即捕獲所有類型的錯誤,也可傳入元組形式的多種指定錯誤類型

tries:定義捕獲錯誤之后重復運行次數,默認為-1,即為無數次

delay:定義每次重復運行之間的停頓時長,單位秒,默認為0,即無停頓

backoff:呈指數增長的每次重復運行之間的停頓時長,需要配合delay來使用,譬如delay設置為3,backoff設置為2,則第一次間隔為3*2**0=1秒,第二次3*2**1=2秒,第三次3*2**2=4秒,以此類推,默認為1

max_delay:定義backoff和delay配合下出現的等待時間上限,當delay*backoff**n大於max_delay時,等待間隔固定為該值而不再增長

  下面我們通過幾個直觀的例子來更加深刻地認識上述參數:

import time
from retry import retry

'''記錄初始時刻'''
start_time = time.clock()


@retry(delay=1,tries=4,backoff=2)
def demo(start_time):
    '''將當前時刻與初始時刻的時間差(單位:S)作差並四舍五入'''
    print(round(time.clock()-start_time,0))
    raise

demo(start_time)

  在上例中,我們設置delay為1,tries為4,backoff為2,通過我們的自定義函數來記錄每次重復運行與初始時刻的時間差,這樣第一次與第二次間隔時間為1*2**0=1,第二次與第三次間隔為1*2**1=2,第三次與第四次間隔4,運行結果如下,到達預定的運行狀況后程序就會報錯從而終止運行:

  符合我們上面的計算結果,下面我們設置一個較小的max_delay:

import time
from retry import retry

'''記錄初始時刻'''
start_time = time.clock()


@retry(delay=1,tries=10,backoff=2,max_delay=20)
def demo(start_time):
    '''將當前時刻與初始時刻的時間差(單位:S)作差並四舍五入'''
    print(round(time.clock()-start_time,0))
    raise

demo(start_time)

  運行結果如下:

  可以看到,在delay和backoff共同控制下的間隔時長超過20秒后,之后的每一次間隔時長都固定為20秒,直到所有的tries運行結束。

 

  利用retry,我們可以在譬如網絡爬蟲過程中更加簡潔靈活地控制錯誤處理過程,使得代碼具有更好的可讀性,以上就是本文的基本內容,如有筆誤,望指出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM