簡體   English   中英

如何重試 x 次並打印長時間睡眠

[英]How to retry x times and put a long sleep with a print

我一直在試圖了解退避是如何工作的。 我的目標是每當我達到 status_code 等:405 5 次。 我想休眠 60000 秒並打印出出現狀態錯誤 405。

現在我已經寫了:

import time

import backoff
import requests

@backoff.on_exception(
    backoff.expo,
    requests.exceptions.RequestException,
    max_tries=5,
    giveup=lambda e: e.response is not None and e.response.status_code == 405
)
def publish(url):
    r = requests.post(url, timeout=10)
    r.raise_for_status()


publish("https://www.google.se/")

現在發生的情況是,如果它只達到 405 一次,它將引發 status_code 並停止腳本。 我正在尋找的是如何讓腳本重試 5 次,如果狀態是 405 連續 5 次,那么我們想要長時間睡眠並打印出來。 如何使用 backofF 做到這一點? 我也想提出其他建議:)

舊的計數器方式:

    import requests
    import time
    from requests.exceptions import ConnectionError, ReadTimeout, RequestException, Timeout
    
    exception_counter = 0
    
    while True:
    
        try:
            response = requests.get("https://stackoverflow.com/", timeout=12)
    
            if response.ok:
                print("Very nice")
                time.sleep(60)
    
            else:
                print(
                    f'[Response -> {response.status_code}]'
                    f'[Response Url -> {response.url}]'
                )
                time.sleep(60)
    
                if response.status_code == 403:
                    if exception_counter >= 10:
                        print("Hit limitation of counter: Response [403]")
                        time.sleep(4294968)
    
                    exception_counter += 1
    
        
    except (ConnectionError) as err:
        print(err)
        time.sleep(random.randint(1, 3))
        
        if exception_counter >= 10:
            print(f"Hit limitation of coonnectionerror {err}")
            time.sleep(4294968)
            continue
        
        exception_counter += 1
        continue
        
    except (ReadTimeout, Timeout) as err:
        print(err)
        time.sleep(random.randint(1, 3))
        continue

    except RequestException as err:
        print(err)
        time.sleep(random.randint(1, 3))
        continue

    except Exception as err:
        print(err)
        time.sleep(random.randint(1, 3))
        
        if exception_counter >= 10:
            print(f"Hit limitation of Exception {err}")
            time.sleep(4294968)
            continue
        
        exception_counter += 1
        continue

您沒有說在睡眠 60000 秒后要做什么,所以我將其設置為在四次嘗試后睡眠,然后在正確失敗之前進行最后一次(第五次)嘗試。

您可以使用on_backoff處理程序添加您要求的自定義邏輯。

此外,我重新調整了您的giveup ,您可能以錯誤的方式使用了 boolean。

import time
import backoff
import requests


def backoff_hdlr(details):
    print("backoff_hdlr", details)
    if details["tries"] >= 4:
        print(f"sleeping")
        time.sleep(1)  # 60000


@backoff.on_exception(
    backoff.expo,
    requests.exceptions.RequestException,
    max_tries=5,
    giveup=lambda e: e.response.status_code != 405,
    on_backoff=backoff_hdlr,
)
def publish(url):
    print(f"called publish with url={url}")
    r = requests.post(url, timeout=10)
    r.raise_for_status()


publish("https://www.google.se/")
/Users/michael/.conda/envs/mip_typing/bin/python /Users/michael/git/mip_typing/scratch_2.py
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 1, 'elapsed': 1.5e-05, 'wait': 0.8697943681459608}
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 2, 'elapsed': 1.144912, 'wait': 1.5425500028676453}
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 3, 'elapsed': 2.949183, 'wait': 0.2052666718206697}
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 4, 'elapsed': 3.418447, 'wait': 5.113712077372433}
sleeping
called publish with url=https://www.google.se/
Traceback (most recent call last):
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM