方法不对,代码翻倍。Requests 如何正确重试?

这是「进击的Coder」的第 845 篇技术分享

作者:kingname

来源:未闻 Code

阅读本文大概需要 4 分钟。

程序员是一个需要持续学习的群体,如果你发现你现在写的代码跟你 5 年前的代码没什么区别,说明你掉队了。

我们在做 Python 开发时,经常使用一些第三方库,这些库很多年来持续添加了新功能。但我发现很多同学在使用这些第三方库时,根本不会使用新的功能。他们的代码跟几年前没有任何区别。

举个例子,使用 Request 发起 HTTP 请求,请求失败时,不管什么原因,原地重试最多 3 次。很多人主要有下面 3 种写法来重试。

常见的老方法

使用第三方库

这类同学会使用一些专业做重试的第三方库,例如 tenacity。详见我的这篇文章:Tenacity——Exception Retry 从此无比简单

手动写装饰器

这类同学会使用装饰器,所以一般会手写装饰器从而复用,例如:

def retry(func):
    def wrap(*args, **kwargs):
        for _ in range(3):
            try:
                result = func(*args, **kwargs)
                return result
            except Exception as e:
                print('报错了,重试')
        return {}
    return wrap


@retry
def make_request(url):
    print('以下是发起请求的相关代码')

反复 for 循环

还有一些同学,写代码走的是野路子:

def login():
    for i in range(10):  # 重试10次
        try:
            resp = requests.get('某某URL')
            return resp.json()
        except Exception as e:
            print(f'请求报错了,重试第{i}次')
            continue

这类同学基本不会复用代码。代码里面要向 N 个 url 发起请求,他们就会在 N 个地方像上面这样写代码。

新的方法

这里我虽然说是新方法,但是这个方法应该至少在 9 年前就能用了。只是网上用的人比较少。我们可以使用 requests 自带的HTTPAdapter来实现自动重试。当我们不关心具体报错是什么,只需要机械重试时,就可以使用这个方法:

import requests
from requests.adapters import HTTPAdapter, Retry

session = requests.Session()
retries = Retry(total=3, backoff_factor=1)
session.mount('http://', HTTPAdapter(max_retries=retries))
session.mount('https://', HTTPAdapter(max_retries=retries))

# 接下来使用session发起的所有请求,默认最多会重试3次
session.get('http://httpbin.org/delay/5', timeout=2)
session.get('https://www.kingname.info')
...

b4687a7b3e8309cf1c2ed18389343994.png

End

欢迎大家加入【ChatGPT&AI 变现圈】,零门槛掌握 AI 神器!我们带你从小白到高手,解锁智能问答、自动化创作、技术变现的无限可能。与我们共同成长,开启 AI 新征程!立即行动,未来已来!(详情请戳:知识星球:ChatGPT&AI 变现圈,正式上线!

扫码加入:

14f14ecc64cfcf959b74154ecb82cb19.jpeg

好文和朋友一起看~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值