詳解Python如何優(yōu)雅的重試
正文
在編碼中,一些涉及網(wǎng)絡(luò)連接的代碼片段經(jīng)常需要重試,本文講解了如何一步一步實(shí)現(xiàn)一個(gè)優(yōu)雅的retry
裝飾器以及tenacity
庫的使用。
原始版本v0.0
假如有一個(gè)函數(shù)形式如下,函數(shù)有一些建立網(wǎng)絡(luò)連接的邏輯
def f(): # do some connections return 0
為了避免偶爾的網(wǎng)絡(luò)連接失敗,需要加上重試機(jī)制,那么最簡(jiǎn)單的形式就是在對(duì)應(yīng)的代碼片段加一個(gè)循環(huán),循環(huán)體里使用異常捕獲,連接成功時(shí)退出循環(huán),否則就重復(fù)執(zhí)行相關(guān)邏輯,此時(shí)修改之后的函數(shù)f
如下
def f(): while 1: try: # do some connections break except ConnectionError: continue return 0
裝飾器版本v1.0
可以使用裝飾器對(duì)代碼進(jìn)行抽象。例如現(xiàn)在有兩個(gè)函數(shù)f1
和f2
需要加上重試機(jī)制,寫一個(gè)名為retry
的裝飾器函數(shù),用其裝飾f1
和f2
即可。這樣做避免了對(duì)老代碼的修改,同時(shí)也實(shí)現(xiàn)了代碼復(fù)用。示例如下
def retry(f): def wrap(*args, **kwargs): while 1: try: return f(*args, **kwargs) except ConnectionError: continue return wrap @retry def f1(): # do some connections return 0 @retry def f2(): # do some other connections return 0
帶參數(shù)的裝飾器版本v1.1
v1.0
的版本retry
裝飾器還有一些問題,假如有的函數(shù)想重試3次,有的想重試5次,重試的間隔也根據(jù)不同函數(shù)不一樣,v1.0
是無法實(shí)現(xiàn)的。此時(shí)可以借助帶參數(shù)的三層裝飾器,例如以下代碼實(shí)現(xiàn)的retry
裝飾器,可以傳入times
和interval
兩個(gè)參數(shù)來設(shè)定重試次數(shù)和重試間隔
def retry(times, interval): def decorator(f) def wrap(*args, **kwargs): while times: try: return f(*args, **kwargs) except ConnectionError: times -= 1 time.sleep(interval) continue return wrap return decorator # 重試3次每次間隔10秒 @retry(times=3, interval=10) def f1(): # do some connections return 0 # 重試5次每次間隔15秒 @retry(times=5, interval=15) def f2(): # do some other connections return 0
裝飾器支持參數(shù)之后,可以根據(jù)需要定義更豐富的參數(shù),比如通過參數(shù)來設(shè)定需要捕獲哪些異常等。
tenacity版本
tenacity
是一個(gè)第三方開源庫,用于函數(shù)的重試,實(shí)際上它的功能與原理是上面自己寫的代碼類似的!只是它可定義的參數(shù)更豐富,如果不想重復(fù)造輪子,拿來直接用就可以。代碼示例如下
from tenacity import retry, stop_after_attempt, wait_fixed # 不帶任何參數(shù)的重試 @retry def f(): # do some connections return 0 # 重試5次每次間隔15秒 @retry(stop=stop_after_attempt(5), wait=wait_fixed(15)) def f(): # do some connections return 0
以上就是詳解Python如何優(yōu)雅的重試的詳細(xì)內(nèi)容,更多關(guān)于Python優(yōu)雅重試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python?中設(shè)置請(qǐng)求的最大重試次數(shù)示例代碼
- python爬蟲多次請(qǐng)求超時(shí)的幾種重試方法(6種)
- Python爬蟲庫requests-html進(jìn)行HTTP請(qǐng)求HTML解析等高級(jí)功能應(yīng)用
- Python爬蟲請(qǐng)求模塊Urllib及Requests庫安裝使用教程
- Python網(wǎng)絡(luò)請(qǐng)求使用Requests庫抓取解析數(shù)據(jù)
- Python中最強(qiáng)大的重試庫Tenacity使用探索
- 手把手教你實(shí)現(xiàn)Python重試超時(shí)裝飾器
- Python中的請(qǐng)求重試策略深入探討
相關(guān)文章
Python對(duì)list列表進(jìn)行去重的幾種方法
python?列表就是我們js中的數(shù)組了,我們下文整理幾個(gè)常用的python?列表去重實(shí)現(xiàn)方法,非常的簡(jiǎn)單好用,通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10python如何實(shí)現(xiàn)圖片轉(zhuǎn)文字
這篇文章主要介紹了python如何實(shí)現(xiàn)圖片轉(zhuǎn)文字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)CNN卷積層及nn.Module類示例分析
這篇文章主要為大家介紹了人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)CNN卷積層及nn.Module類示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11詳解將Pandas中的DataFrame類型轉(zhuǎn)換成Numpy中array類型的三種方法
這篇文章主要介紹了詳解將Pandas中的DataFrame類型轉(zhuǎn)換成Numpy中array類型的三種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07如何利用Python實(shí)現(xiàn)簡(jiǎn)單C++程序范圍分析
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)簡(jiǎn)單C++程序范圍分析,文章以舉例說明及過程實(shí)現(xiàn)思路的方式展開講解,具有一定的的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-02-02