一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python retrying 重試機制詳解

Python retrying 重試機制詳解

2022-03-08 00:05程序員-夏天 Python

這篇文章主要為大家介紹了Python retrying 重試機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

我們在程序開發中,經常會需要請求一些外部的接口資源,而且我們不能保證每次請求一定會成功,所以這些涉及到網絡請求的代碼片段就需要加上重試機制。下面來說一下Python中的重試方法。

循環加判斷

最簡單的重試方式就是在需要進行重試的代碼片段上加一個循環,程序內捕獲異常,如果執行成功就退出循環,執行失敗就就重復執行相關代碼,例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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(https://www.hahaha.cn/haha)

執行結果:

Python retrying 重試機制詳解

由于請求了一個不存在的網址,所以一直在重試,知道達到最大次數10次。但是這樣有一定的代碼侵入性,在業務邏輯上加入循環判斷顯得很不美觀,別著急,往下看,還有更好的方法。

retrying

retrying是Python的一個第三方庫,它提供一個裝飾器函數retry,被裝飾的業務函數就會在運行失敗的條件下重新執行,默認只要報錯就會一直重試,直至執行成功。

可以使用pip install retrying進行安裝。

例如下面一段代碼,我們使用生成隨機數的大小的方式模擬業務的成功與失敗,只要是生成的隨機數大于2,都視為失敗,就會重試,直到生成的隨機數小于2:

?
1
2
3
4
5
6
7
8
9
import random
from retrying import retry
@retry
def random_with_retry():
    if random.randint(0, 10) > 2:
        print("大于2,重試...")
        raise Exception("大于2")
    print("小于2,成功!")
random_with_retry()

運行結果如下:

Python retrying 重試機制詳解

retry還可以接受一些參數,下面是源碼中Retrying類的初始化函數中可選的參數:

Python retrying 重試機制詳解

stop_max_attempt_number:最大重試次數,超過該次數就停止重試

stop_max_delay:最大延遲時間(執行這個方法重試的總時間),超過該時間就停止

wait_fixed:兩次retrying之間的等待時間

wait_random_minwait_random_max:用隨機的方式產生兩次retrying之間的等待時間

wait_incrementing_startwait_incrementing_increment:每調用一次增加固定時長

wait_exponential_multiplierwait_exponential_max:以指數的形式產生兩次retrying之間的等待時間,產生的值為2^previous_attempt_number * wait_exponential_multiplierprevious_attempt_number是前面已經retry的次數,如果產生的這個值超過了wait_exponential_max的大小,那么之后兩個retrying之間的停留值都為wait_exponential_max

特別需要注意的是retry_on_exception參數,它接收一個函數,用法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 判斷異常
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參數類似。

我們可以根據自己的需要進行合理的搭配這些參數,達到我們想要的效果。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weixin_50097774/article/details/121477820

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本一区二区免费在线观看 | 五月天婷婷网亚洲综合在线 | 欧美日韩亚洲成人 | 美女啪啪国产 | 免费看国产一级片 | 欧美高清videosex极品 | 99热这里只有精品在线 | 亚洲国产第一区二区三区 | 福利社在线免费观看 | 色戒完整版2小时38分钟 | 欧美理论片手机在线观看片免费 | 69日本xxxx| 国产麻豆流白浆在线观看 | 国产馆在线观看免费的 | 羞羞色男人的天堂伊人久久 | 国产在线观看色 | 麻豆在线md0087免费 | 国产亚洲毛片在线 | 黄动漫软件车车好快的车车 | 大学生宿舍飞机 free | 无码精品一区二区三区免费视频 | 牛牛影院成人免费网页 | 日韩成人在线网站 | 国产女王女m视频vk 国产农村一级特黄α真人毛片 | 精品国产在线观看 | 久久这里有精品 | 丝袜足控免费网站xx动漫漫画 | 国产网站免费看 | 天堂va亚洲va欧美va国产 | 欧美高清无砖专区欧美精品 | 久久精品国产免费播放 | 日韩精品欧美激情国产一区 | 色综合中文字幕在线亚洲 | 成人国产在线视频在线观看 | 国产欧美日韩综合二区三区 | 草嫩社区 | 精品亚洲视频在线观看 | 久久精品久久久久 | 国产综合视频 | 日韩精品免费一区二区 | 男人桶女下面60分钟视频 |