当前位置: 首页 > news >正文

Tenacity重试直到成功

你给出的这段代码:

@tenacity.retry(retry=tenacity.retry_if_result(lambdais_acquired:bool(notis_acquired)),stop=tenacity.stop_after_delay(timeout),before=tries)

Tenacity库中的一个重试装饰器,用于自动重试某个函数,直到满足特定条件为止。


🔍 逐部分解释

1.@tenacity.retry(...)

这是 Tenacity 提供的装饰器,用于包装一个函数,使其在失败时自动重试。


2.retry=tenacity.retry_if_result(lambda is_acquired: bool(not is_acquired))
  • 作用:只有当函数的返回值为False时,才触发重试。
  • retry_if_result(...)是 Tenacity 提供的一个条件重试器。
  • lambda is_acquired: bool(not is_acquired)是一个匿名函数,等价于:
defcheck(is_acquired):returnnotis_acquired# 即如果未获取锁,就重试

总结如果函数返回False,就重试;返回True,就停止重试。


3.stop=tenacity.stop_after_delay(timeout)
  • 作用:设置最大重试时间为timeout秒(由函数参数传入,默认是 300 秒)。
  • 超过这个时间后,即使条件仍不满足,也停止重试。

4.before=tries
  • 作用:每次重试前调用tries对象(是一个RetryState实例),通常用于记录重试次数或日志。
  • 你可以理解为:每次重试前,执行tries(),比如打印日志或更新状态。

🧪 举个例子

假设你有一个函数try_lock(),它尝试获取一个分布式锁,返回True表示成功,False表示失败。

importtenacityimporttimeclassRetryState:def__init__(self):self.tries=0def__call__(self,retry_state):self.tries+=1print(f"[RetryState] 第{self.tries}次尝试...")# 模拟一个锁获取函数,前 4 次失败,第 5 次成功call_count=0deftry_lock():globalcall_count call_count+=1success=call_count>=5print(f"[try_lock] 第{call_count}次调用,结果:{'成功'ifsuccesselse'失败'}")returnsuccess# 使用 tenacity 重试机制@tenacity.retry(retry=tenacity.retry_if_result(lambdax:notx),# 返回 False 就重试stop=tenacity.stop_after_delay(10),# 最多重试 10 秒before=RetryState()# 每次重试前调用)defacquire_lock():returntry_lock()# 调用result=acquire_lock()print("最终结果:",result)

✅ 输出示例:

[RetryState] 第 1 次尝试... [try_lock] 第 1 次调用,结果:失败 [RetryState] 第 2 次尝试... [try_lock] 第 2 次调用,结果:失败 [RetryState] 第 3 次尝试... [try_lock] 第 3 次调用,结果:失败 [RetryState] 第 4 次尝试... [try_lock] 第 4 次调用,结果:失败 [RetryState] 第 5 次尝试... [try_lock] 第 5 次调用,结果:成功 最终结果: True

✅ 总结一句话

这个装饰器的作用是:

每隔一段时间重试一次函数,直到它返回True或超过最大超时时间为止,每次重试前记录状态。


如果你想,我可以帮你画一个流程图或写成伪代码来加深理解。

http://www.cnnetsun.cn/news/7712.html

相关文章:

  • 自动化运维工程师之ansible启动rpcbind和nfs服务
  • 数字供应链系统哪个好?2025 供应链系统推荐排名来了,八大供应链系统
  • M.I.B.终极指南:解锁汽车娱乐系统的隐藏功能
  • 把 ABAP CDS 讲清楚:从 ABAP 7.40 SP05 的语义建模,到 SP08 的函数、参数化与扩展视图
  • 终极PHP兼容性检查工具:轻松应对版本迁移挑战
  • Kamailio usrloc 细节测试
  • 探索STM32单片机仿真温湿度采集控制系统
  • MediaPipe实时多模态感知:从单点检测到全身协同追踪的技术革命
  • SMDJ33A单向 TVS瞬态抑制二极管 :33V电压000W 浪涌,中压电路防护核心
  • MCP 2025量子编程认证重大升级(新增内容全曝光)
  • Bottles:让Windows软件在Linux上轻松运行的智能解决方案
  • 日志框架问答整理(吊打面试官)
  • 从零到安全工程师:2025年必备技能树详解(附实战学习蓝图)
  • Komikku:免费开源的Android漫画阅读器终极指南
  • 长耗时接口异步改造总结
  • 解码人类智慧密码——贾子五定律(Kucius Five Laws):贾子认知、历史、战略、军事、文明五定律
  • 启点创新智慧景区小程序系统,景区智能化售票系统,景区购票管理系统
  • 3种快速安装readr数据读取工具的方法:从入门到精通
  • 对比实测:传统vs自动化VMware安装,效率提升300%
  • 跨平台字体革命:PingFangSC字体包的终极解决方案
  • 14 类圣诞核心 SVG 交互方案拆解(附案例 + 资源)
  • 7个技巧轻松搞定Node.js版本升级:从16.x到20.x的无痛迁移指南
  • MCP SC-400配置避坑手册(一线专家亲授10大常见错误)
  • Ghost没落、同行消失,深度却靠国产系统翻盘?关键点不止一个!
  • 5分钟掌握PROPKA:蛋白质pKa预测的终极入门指南
  • dotNetFx40_Full_x86_x64:解决Windows开发环境配置难题的终极方案
  • 终极解决方案:如何快速解除Cursor试用限制
  • PMail个人邮件服务器:3步搭建私有邮箱的完整指南
  • 阿里自研Wan2.2-T2V-A14B如何实现720P高清视频生成?
  • 从0到1,普通开发者也能构建自己的AI Agent(附完整流程)