日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
少有人知的Python"重試機(jī)制"

 為了避免由于一些網(wǎng)絡(luò)或等其他不可控因素,而引起的功能性問(wèn)題。比如在發(fā)送請(qǐng)求時(shí),會(huì)因?yàn)榫W(wǎng)絡(luò)不穩(wěn)定,往往會(huì)有請(qǐng)求超時(shí)的問(wèn)題。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到臨湘網(wǎng)站設(shè)計(jì)與臨湘網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋臨湘地區(qū)。

這種情況下,我們通常會(huì)在代碼中加入重試的代碼。重試的代碼本身不難實(shí)現(xiàn),但如何寫得優(yōu)雅、易用,是我們要考慮的問(wèn)題。

這里要給大家介紹的是一個(gè)第三方庫(kù) - Tenacity (標(biāo)題中的重試機(jī)制并并不準(zhǔn)確,它不是 Python 的內(nèi)置模塊,因此并不能稱之為機(jī)制),它實(shí)現(xiàn)了幾乎我們可以使用到的所有重試場(chǎng)景,比如:

  1. 在什么情況下才進(jìn)行重試?
  2. 重試幾次呢?
  3. 重試多久后結(jié)束?
  4. 每次重試的間隔多長(zhǎng)呢?
  5. 重試失敗后的回調(diào)?

在使用它之前 ,先要安裝它

 
 
 
  1. $ pip install tenacity

1. 最基本的重試

無(wú)條件重試,重試之間無(wú)間隔

 
 
 
  1. from tenacity import retry
  2. @retry
  3. def test_retry():
  4.     print("等待重試,重試無(wú)間隔執(zhí)行...")
  5.     raise Exception
  6. test_retry()

無(wú)條件重試,但是在重試之前要等待 2 秒

 
 
 
  1. from tenacity import retry, wait_fixed
  2. @retry(wait=wait_fixed(2))
  3. def test_retry():
  4.     print("等待重試...")
  5.     raise Exception
  6. test_retry()

2. 設(shè)置停止基本條件

只重試7 次

 
 
 
  1. from tenacity import retry, stop_after_attempt
  2. @retry(stop=stop_after_attempt(7))
  3. def test_retry():
  4.     print("等待重試...")
  5.     raise Exception
  6. test_retry()

重試 10 秒后不再重試

 
 
 
  1. from tenacity import retry, stop_after_delay
  2. @retry(stop=stop_after_delay(10))
  3. def test_retry():
  4.     print("等待重試...")
  5.     raise Exception
  6. test_retry()

或者上面兩個(gè)條件滿足一個(gè)就結(jié)束重試

 
 
 
  1. from tenacity import retry, stop_after_delay, stop_after_attempt
  2. @retry(stop=(stop_after_delay(10) | stop_after_attempt(7)))
  3. def test_retry():
  4.     print("等待重試...")
  5.     raise Exception
  6. test_retry()

3. 設(shè)置何時(shí)進(jìn)行重試

在出現(xiàn)特定錯(cuò)誤/異常(比如請(qǐng)求超時(shí))的情況下,再進(jìn)行重試

 
 
 
  1. from requests import exceptions
  2. from tenacity import retry, retry_if_exception_type
  3. @retry(retry=retry_if_exception_type(exceptions.Timeout))
  4. def test_retry():
  5.     print("等待重試...")
  6.     raise exceptions.Timeout
  7. test_retry()

在滿足自定義條件時(shí),再進(jìn)行重試。

如下示例,當(dāng) test_retry 函數(shù)返回值為 False 時(shí),再進(jìn)行重試

 
 
 
  1. from tenacity import retry, stop_after_attempt, retry_if_result
  2. def is_false(value):
  3.     return value is False
  4. @retry(stop=stop_after_attempt(3),
  5.        retry=retry_if_result(is_false))
  6. def test_retry():
  7.     return False
  8. test_retry()

4. 重試后錯(cuò)誤重新拋出

當(dāng)出現(xiàn)異常后,tenacity 會(huì)進(jìn)行重試,若重試后還是失敗,默認(rèn)情況下,往上拋出的異常會(huì)變成 RetryError,而不是最根本的原因。

因此可以加一個(gè)參數(shù)(reraise=True),使得當(dāng)重試失敗后,往外拋出的異常還是原來(lái)的那個(gè)。

 
 
 
  1. from tenacity import retry, stop_after_attempt
  2. @retry(stop=stop_after_attempt(7), reraise=True)
  3. def test_retry():
  4.     print("等待重試...")
  5.     raise Exception
  6. test_retry()

5. 設(shè)置回調(diào)函數(shù)

當(dāng)最后一次重試失敗后,可以執(zhí)行一個(gè)回調(diào)函數(shù)

 
 
 
  1. from tenacity import *
  2. def return_last_value(retry_state):
  3.     print("執(zhí)行回調(diào)函數(shù)")
  4.     return retry_state.outcome.result()  # 表示返回原函數(shù)的返回值
  5. def is_false(value):
  6.     return value is False
  7. @retry(stop=stop_after_attempt(3),
  8.        retry_error_callback=return_last_value,
  9.        retry=retry_if_result(is_false))
  10. def test_retry():
  11.     print("等待重試中...")
  12.     return False
  13. print(test_retry())

輸出如下

 
 
 
  1. 等待重試中...
  2. 等待重試中...
  3. 等待重試中...
  4. 執(zhí)行回調(diào)函數(shù)
  5. False

網(wǎng)頁(yè)標(biāo)題:少有人知的Python"重試機(jī)制"
本文鏈接:http://www.5511xx.com/article/dpsoios.html