【问题标题】:python requests: Retrying until a valid response is receivedpython请求:重试直到收到有效响应
【发布时间】:2014-11-21 13:04:05
【问题描述】:

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

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

【问题讨论】:

  • 我想你想要pass 而不是continue。正如所写,cnt 变量永远不会增加。

标签: python exception python-requests


【解决方案1】:

您可能需要考虑在重试之间引入等待,因为许多暂时性问题可能需要几秒钟以上的时间才能清除。此外,我建议以几何级数增加等待时间,以便系统有足够的时间恢复:

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

在这种情况下,您的重试将在 1、2 和 4 秒后进行。请注意最大重试次数。您将重试次数增加到 10 次,接下来您知道代码将等待 17 分钟。

编辑:

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

【讨论】:

  • 我同意几何重试。但是,还建议在延迟时间中添加随机抖动(例如,最多 500 毫秒),以减少同时出现多个并发请求的可能性。应在每次重试时计算每个随机毫秒数。
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
相关资源
最近更新 更多