成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
在Python生態中,retrying庫提供了非常便捷的裝飾器和函數來幫助我們輕松添加失敗重試機制。

前言

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

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

所以接下來我就來介紹一個另外的一個專門用于失敗重試的庫:retrying。

定義

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

1.下載retrying

pip install retrying

2.無參數重試

我們可以直接在函數上使用裝飾器@retry來進行失敗重試

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

func()

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

所以我們在進行失敗重試的時候最好是需要加上一些參數來限制失敗重試。

3.有參數重試

(1) stop_max_attempt_number

在retry中傳入stop_max_attempt_number參數后可以指定失敗重試的次數

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

func()

因為這里我們指定了失敗后進行兩次重試,如果重試執行兩次后還是報錯則結束重試,將錯誤信息拋出來。

(2) wait_fixed傳入wati_fixed后,可以指定重試的時間

from retrying import retry
import time

# 設置三秒重試一次
@retry(wait_fixed=3000)  
def func():
    print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

配置重試間隔時間后,成語遇到執行失敗或者報錯后,就會根據設置的重試時間去進行重試執行

(3) wait_random_min和wait_random_max

通常wait_random_min和wait_random_max是一起搭配使用的,可以設置一個重試等待的時間,然后會在設置的時間區間內隨機取一個等待時間進行重試

from retrying import retry
import 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 result

func()

(4) 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

通俗來點講就是每次重試的時間以wait_exponential_multiplier設置的值2,如果重試后還是失敗則繼續2,直到最后的值等于或則超過wait_exponential_max設置的值后,后面的每一次重試等待時間都是wait_exponential_max設置的值

from retrying import retry
import 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 result

func()

(5)wait_func

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

在這里就可以使用到wait_func參數,它接收一個可執行函數,返回一個具體的間隔時間數值,單位ms。接收的函數須接收兩個參數:attempt_number當前運行次數,delay_since_first_attempt_ms當前重試機制運行時間(單位ms)

from retrying import retry
import time


def 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 result

func()

使用wait_func通過調用其他可執行的函數,我們可以借助它來做一些臨時的補救措施,避免程序一直無法運行而產生的影響。

(6) 其他參數

在retry中還存在有很多參數,有興趣的小伙伴可以去詳細了解下

  • 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用法差不多。
責任編輯:趙寧寧 來源: Python都知道
相關推薦

2024-01-08 09:38:51

Java數據

2021-02-26 20:07:54

安全性健壯性代碼

2017-02-05 15:10:55

Option函數式編程代碼

2025-02-13 00:28:26

2018-06-29 14:51:41

Java健壯性實踐

2021-05-27 08:15:05

CSS CSS prefer技巧

2025-03-11 08:30:00

Pythonretrying代碼

2011-11-09 13:59:27

代碼腐爛

2020-07-15 08:17:16

代碼

2010-03-23 14:12:43

Python開發Win

2024-01-03 08:00:00

Java軟件開發代碼

2021-05-07 09:00:00

JavaScript開發代碼

2010-07-17 00:55:48

PHP Telnet

2011-11-03 15:44:10

程序員

2022-08-23 14:57:43

Python技巧函數

2022-08-29 00:37:53

Python技巧代碼

2011-12-07 10:22:11

美信云網管閥值

2013-07-29 14:28:43

JQueryJQuery實現分頁分頁程序代碼

2009-06-17 14:29:50

java程序代碼

2024-10-11 06:00:00

Python代碼編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品一区二区 | 国产国产精品久久久久 | 久久九精品 | av天天看 | 国产一区二区三区免费 | 中文一区二区 | 天天操天天干天天爽 | 亚洲精品18 | 午夜合集 | 欧美日韩精品区 | 一区二区视频 | 久久99精品久久久97夜夜嗨 | 午夜精品导航 | 国产精品中文 | 亚洲欧美高清 | 日韩欧美精品在线 | 国产美女视频黄a视频免费 国产精品福利视频 | 免费在线观看黄色av | 免费观看一级特黄欧美大片 | a在线视频观看 | 永久网站| 欧美亚洲国产一区二区三区 | 午夜在线免费观看 | 高清视频一区二区三区 | 久草新视频| 亚洲成人免费视频在线 | 国产三级国产精品 | 日韩精品一区二区三区在线播放 | 国产成人精品久久二区二区91 | 久久精品无码一区二区三区 | 午夜视频在线观看一区二区 | 91视频91| 日本福利视频 | 色欧美片视频在线观看 | 国产 日韩 欧美 在线 | 亚洲 自拍 另类 欧美 丝袜 | 男女网站在线观看 | 粉嫩国产精品一区二区在线观看 | 国产一区亚洲 | 亚洲精品中文字幕在线 | 爱综合 |