python请求:重试直到收到有效响应

yay*_*ayu 0 python exception python-requests

我想知道是否存在一种常见的模式,可以重试请求一定次数(由于服务器错误或网络故障而导致失败)。我想出了这个,我愿意在那里找到更好的实现。

cnt=0
while cnt < 3:
    try:
        response = requests.get(uri)
        if response.status_code == requests.codes.ok:
            return json.loads(response.text)
    except requests.exceptions.RequestException:
        continue
    cnt += 1
return False
Run Code Online (Sandbox Code Playgroud)

mar*_*seu 5

您可能要考虑在重试之间引入等待,因为许多暂时性问题可能需要花费几秒钟以上的时间才能解决。另外,我建议以几何方式增加等待时间,以便有足够的时间使系统恢复:

import time

cnt=0
max_retry=3
while cnt < max_retry:
    try:
        response = requests.get(uri)
        if response.status_code == requests.codes.ok:
            return json.loads(response.text)
        else:
            # Raise a custom exception
    except requests.exceptions.RequestException as e:
        time.sleep(2**cnt)
        cnt += 1
        if cnt >= max_retry:
            raise e
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的重试将在1、2和4秒后发生。只要注意最大的重试次数。您将重试次数增加到10,然后您知道代码将等待17分钟。

编辑:

仔细查看您的代码,false当您用尽重试后再返回实际上没有任何意义。您确实应该向调用者提出异常,以便可以传达问题。另外,您检查requests.codes.ok但没有else动作定义。