重试机制在编程中是比较常见的场景,主要被用于处理那些可能由于临时性故障或网络波动等原因而失败的操作。
本文介绍如何通过Python装饰器来实现重试机制,
从而能够在尽量少修改现有代码的基础上,给其中某些函数加上重试机制。
1. 概要
关于Python的装饰器,只是一个语法糖,原理也比较简单,这里不在赘述。
关于为什么要用重试机制,
首先,它能显著提高了系统的稳定性和可靠性。
因为,在分布式系统、网络通信或任何涉及外部资源调用的场景中,失败和异常是难以避免的。
通过引入重试机制,系统能够在遇到这些临时性故障时自动恢复,减少因单次失败导致的整体服务中断。
其次,重试机制有助于提升用户体验。
对于用户来说,如果系统因为一次网络抖动或短暂的服务器不可用就抛出错误,那么用户可能会感到不满。
通过重试机制,系统可以在用户几乎无感知的情况下恢复服务,从而提升用户体验。
此外,重试机制还可以帮助系统更好地应对突发的高负载或资源紧张的情况。
当系统面临大量请求或资源争用时,某些操作可能会因为资源不足而失败。
通过合理设置重试间隔和重试次数,系统可以平滑地处理这些突发情况,避免因为短暂的资源不足而导致服务崩溃。
2. 实现重试机制
下面是我目前在用的一个重试装饰器:
python
复制代码
from functools import wraps
from time import sleep
def retry(retries: int = 3, delay: float = 1):
"""
函数执行失败时,重试
:param retries: 最大重试的次数
:param delay: 每次重试的间隔时间,单位 秒
:return:
"""
# 校验重试的参数,参数值不正确时使用默认参数
if retries < 1 or delay <= 0:
retries = 3
delay = 1
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 第一次正常执行不算重试次数,所以retries+1
for i in range(retries + 1):
try:
return func(*args, **kwargs)
except Exception as e:
# 检查重试次数
if i == retries:
print(f"Error: {repr(e)}")
print(f'"{func.__name__}()" 执行失败,已重试{retries}次')
break
else:
print(
f"Error: {repr(e)},{delay}秒后第[{i+1}/{retries}]次重试..."
)
sleep(delay)
return wrapper
return decorator
这个装饰器有两个参数,一个是重试次数(retries
),一个是每次重试的间隔(delay
)。
代码比较简单,通过捕获函数func
的异常来重试,重试次数达到最大重试次数后退出。
3. 使用重试机制示例
使用上面装饰器的示例:
python
复制代码
from decorators import retry
import time
@retry(retries=2, delay=2)
def pay():
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"[{now}]: 开始调用支付接口")
raise Exception("调用支付接口超时...")
@retry(retries=5, delay=1)
def third():
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"[{now}]: 开始调用第三方接口")
raise Exception("调用第三方接口超时...")
if __name__ == "__main__":
pay() # 重试2次,每次间隔2秒
third() # 重试5次,每次间隔1秒
模拟一个支付接口,一个调用第三方的接口,分别看看重试的效果。
简简单单给函数加一个@retry
,就有了重试功能。
4. 总结
总之,在设计和开发系统时,合理地引入和应用重试机制是非常必要的,尤其是需要大量调用第三方服务的时候。
通过装饰器的方式来实现重试机制,能够尽量少的侵入代码的业务逻辑,是一种优雅灵活的方式。
这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!
CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
1️⃣零基础入门
① 学习路线
对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
2️⃣国内外Python书籍、文档
① 文档和书籍资料
3️⃣Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
4️⃣Python面试题
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
5️⃣Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓