日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Python系列:如何提高python程序代碼的健壯性

來源: 責編: 時間:2023-11-17 17:13:58 257觀看
導讀前言在編程的時候,我們難免會遇到一些不可靠的情況,比如網絡請求失敗,數據庫連接超時等等。這些不確定性會讓我們的程序容易出現各種錯誤和異常。那么如何來增加程序的容錯性和健壯性呢?可能大多數人會想到使用try e

前言

在編程的時候,我們難免會遇到一些不可靠的情況,比如網絡請求失敗,數據庫連接超時等等。這些不確定性會讓我們的程序容易出現各種錯誤和異常。那么如何來增加程序的容錯性和健壯性呢?LEC28資訊網——每日最新資訊28at.com

可能大多數人會想到使用try  except來進行異常捕捉進行失敗重試(Retry)。雖然try-escept一個非常常見和有效的方式來增強程序穩定性,但是可能一不小心就會造成棧溢出。LEC28資訊網——每日最新資訊28at.com

所以接下來我就來介紹一個另外的一個專門用于失敗重試的庫:retrying。LEC28資訊網——每日最新資訊28at.com

LEC28資訊網——每日最新資訊28at.com

定義

在Python生態中,retrying庫提供了非常便捷的裝飾器和函數來幫助我們輕松添加失敗重試機制。它可以自定義重試策略、停止條件、等待間隔等,對各種異常進行捕捉處理。使用retrying可以大大減少我們重復編寫失敗重試輪詢的代碼量。LEC28資訊網——每日最新資訊28at.com

1.下載retrying

pip install retrying

2.無參數重試

我們可以直接在函數上使用裝飾器@retry來進行失敗重試LEC28資訊網——每日最新資訊28at.com

import retrying@retrydef func():    for item in range(0,100):        result=item / 0        print(result)        return resultfunc()

但是這種方式并不建議使用,就像上面的代碼,我們都知道0作為除數就會報錯,在上面的func函數中,因為加了@retry裝飾器進行失敗重試,這樣就就會進入一個死循環一直失敗一直重試。LEC28資訊網——每日最新資訊28at.com

所以我們在進行失敗重試的時候最好是需要加上一些參數來限制失敗重試。LEC28資訊網——每日最新資訊28at.com

3.有參數重試

(1) stop_max_attempt_numberLEC28資訊網——每日最新資訊28at.com

在retry中傳入stop_max_attempt_number參數后可以指定失敗重試的次數LEC28資訊網——每日最新資訊28at.com

@retry(stop_max_attempt_number=2)def func():    print(f"記錄失敗重試")    for item in range(0,100):        result=item / 0        print(result)        return resultfunc()

因為這里我們指定了失敗后進行兩次重試,如果重試執行兩次后還是報錯則結束重試,將錯誤信息拋出來。LEC28資訊網——每日最新資訊28at.com

LEC28資訊網——每日最新資訊28at.com

(2) wait_fixed傳入wati_fixed后,可以指定重試的時間LEC28資訊網——每日最新資訊28at.com

from retrying import retryimport time# 設置三秒重試一次@retry(wait_fixed=3000)  def func():    print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S"))    result=1 / 0    print(result)    return resultfunc()

LEC28資訊網——每日最新資訊28at.com

配置重試間隔時間后,成語遇到執行失敗或者報錯后,就會根據設置的重試時間去進行重試執行LEC28資訊網——每日最新資訊28at.com

(3) wait_random_min和wait_random_maxLEC28資訊網——每日最新資訊28at.com

通常wait_random_min和wait_random_max是一起搭配使用的,可以設置一個重試等待的時間,然后會在設置的時間區間內隨機取一個等待時間進行重試LEC28資訊網——每日最新資訊28at.com

from retrying import retryimport time@retry(wait_random_min=1000,wait_random_max=9000)def func():    print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S"))    result=1 / 0    print(result)    return resultfunc()

LEC28資訊網——每日最新資訊28at.com

(4) wait_exponential_multiplier和wait_exponential_maxLEC28資訊網——每日最新資訊28at.com

官方解釋為:以指數的形式產生兩次retrying之間的停留時間, 產生的值為2^previous_attempt_number * wait_exponential_multiplier, previous_attempt_number是前面已經retry的次數, 如果產生的這個值超過了wait_exponential_max的大小, 那么之后兩個retrying之間的停留值都為wait_exponential_maxLEC28資訊網——每日最新資訊28at.com

通俗來點講就是每次重試的時間以wait_exponential_multiplier設置的值2,如果重試后還是失敗則繼續2,直到最后的值等于或則超過wait_exponential_max設置的值后,后面的每一次重試等待時間都是wait_exponential_max設置的值LEC28資訊網——每日最新資訊28at.com

from retrying import retryimport time@retry(wait_exponential_multiplier=1000,wait_exponential_max=10000)def func():    print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S"))    result=1 / 0    print(result)    return resultfunc()

LEC28資訊網——每日最新資訊28at.com

(5)wait_funcLEC28資訊網——每日最新資訊28at.com

在前面介紹的參數都是如何配置失敗沖重試的等待時間或者重試次數之類的,但是我們不能時時刻刻盯著程序,在程序代碼發生錯誤時我們應該要進行發送短信或者郵件之類的提醒才行LEC28資訊網——每日最新資訊28at.com

在這里就可以使用到wait_func參數,它接收一個可執行函數,返回一個具體的間隔時間數值,單位ms。接收的函數須接收兩個參數:attempt_number當前運行次數,delay_since_first_attempt_ms當前重試機制運行時間(單位ms)LEC28資訊網——每日最新資訊28at.com

from retrying import retryimport timedef func_demo(attempt_number,delay_since_first_attempt_ms):    print("函數運行失敗后運行該函數")    if attempt_number == 5:        print("已經重試失敗五次了,開始準備發送提醒")    if attempt_number == 10:        print("已經重試失敗超10次了,發送郵件給相關人員緊急處理")    if attempt_number >10:        print("重試時間過長,做一些其他臨時方案進行補救")    # return一個重試的時間    return 2000@retry(wait_func=func_demo)def func():    print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S"))    result=1 / 0    return resultfunc()

LEC28資訊網——每日最新資訊28at.com

使用wait_func通過調用其他可執行的函數,我們可以借助它來做一些臨時的補救措施,避免程序一直無法運行而產生的影響。LEC28資訊網——每日最新資訊28at.com

(6) 其他參數LEC28資訊網——每日最新資訊28at.com

在retry中還存在有很多參數,有興趣的小伙伴可以去詳細了解下LEC28資訊網——每日最新資訊28at.com

LEC28資訊網——每日最新資訊28at.com

  • stop_max_attempt_number:在停止之前嘗試的最大次數,最后一次如果還是有異常則會拋出異常,停止運行,默認為5次
  • stop_max_delay:最大延遲時間,大概意思就是:如果調用的函數出現異常,那么就會重復調用這個函數,最大調用時間,默認為100毫秒
  • wait_fixed:兩次調用方法期間停留時長, 如果出現異常則會一直重復調用,默認 1000毫秒
  • wait_random_min:在兩次調用方法停留時長,停留最短時間,默認為0
  • wait_random_max:在兩次調用方法停留時長,停留最長時間,默認為1000毫秒
  • wait_incrementing_increment:每調用一次則會增加的時長,默認 100毫秒
  • wait_exponential_multiplier和wait_exponential_max:以指數的形式產生兩次「retrying」之間的停留時間,產生的值為2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已經「retry」的次數,如果產生的這個值超過了wait_exponential_max的大小,那么之后兩個「retrying」之間的停留值都為wait_exponential_max
  • retry_on_exception: 指定一個函數,如果此函數返回指定異常,則會重試,如果不是指定的異常則會退出
  • retry_on_result:指定一個函數,如果指定的函數返回True,則重試,否則拋出異常退出
  • wrap_exception:參數設置為True/False,如果指定的異常類型,包裹在RetryError中,會看到RetryError和程序拋的Exception error
  • stop_func: 每次拋出異常時都會執行的函數,如果和stop_max_delay、stop_max_attempt_number配合使用,則后兩者會失效 (指定的stop_func會有兩個參數:attempts, delay)
  • wait_func:和stop_func用法差不多。

本文鏈接:http://www.www897cc.com/showinfo-26-27967-0.htmlPython系列:如何提高python程序代碼的健壯性

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在GORM中使用并發

下一篇: C++智能指針enable_shared_from_this

標簽:
  • 熱門焦點
  • 6月iOS設備性能榜:M2穩居榜首 A系列只能等一手3nm來救

    沒有新品發布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產生的排名變動,畢竟蘋果新品的發布節奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 使用Webdriver-manager解決瀏覽器與驅動不匹配所帶來自動化無法執行的問題

    1、前言在我們使用 Selenium 進行 UI 自動化測試時,常常會因為瀏覽器驅動與瀏覽器版本不匹配,而導致自動化測試無法執行,需要手動去下載對應的驅動版本,并替換原有的驅動,可能還
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的“新電商三兄弟”成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
Top 主站蜘蛛池模板: 庆阳市| 泸州市| 芜湖市| 贞丰县| 乐安县| 若尔盖县| 太白县| 调兵山市| 乾安县| 绥棱县| 沽源县| 楚雄市| 确山县| 依兰县| 安国市| 沙湾县| 中方县| 稷山县| 汕尾市| 镇沅| 灵宝市| 崇文区| 寿光市| 台山市| 永胜县| 阜新| 金秀| 辽源市| 牙克石市| 成武县| 瑞金市| 九龙坡区| 安龙县| 含山县| 诸暨市| 丹凤县| 锦屏县| 临西县| 慈利县| 原平市| 武夷山市|