news 2026/6/23 13:38:51

Tenacity重试直到成功

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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或超过最大超时时间为止,每次重试前记录状态。


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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 11:28:55

自动化运维工程师之ansible启动rpcbind和nfs服务

通过 systemd 模块分别启动 rpcbind 和 nfs 服务,并设置它们为开机自启,是 NFS 服务部署中启动相关服务的典型配置。下面我会逐部分解析代码的含义、作用以及关键细节。 一、代码整体功能总结 这段代码包含两个独立的 systemd 模块任务,依次完…

作者头像 李华
网站建设 2026/6/23 19:46:52

数字供应链系统哪个好?2025 供应链系统推荐排名来了,八大供应链系统

当数字化转型从“可选项”变为“必选项”,S2B2B供应链系统已成为企业重构供应链竞争力的核心工具。无论是解决传统批发企业“订单传递慢、库存不清”的沉疴,还是支撑新兴跨境商家“多渠道协同、全链路合规”的需求,一款高效的供应链系统都能让…

作者头像 李华
网站建设 2026/6/23 16:09:58

M.I.B.终极指南:解锁汽车娱乐系统的隐藏功能

你是否曾经对车载系统的功能限制感到困扰?为什么高端汽车的原厂娱乐系统总是缺少你想要的功能?如果你的车辆使用的是Harman MHI2或MHIG系列娱乐系统,那么M.I.B.就是你的完美解决方案。这个开源工具就像一个汽车系统的"多功能工具"&…

作者头像 李华
网站建设 2026/6/23 5:22:59

终极PHP兼容性检查工具:轻松应对版本迁移挑战

终极PHP兼容性检查工具:轻松应对版本迁移挑战 【免费下载链接】PHPCompatibility PHPCompatibility/PHPCompatibility: PHPCompatibility是一个针对PHP代码进行兼容性检查的Composer库,主要用于PHP版本迁移时确保现有代码能够适应新版本的PHP语言特性&am…

作者头像 李华
网站建设 2026/6/23 14:15:40

Kamailio usrloc 细节测试

版本 kamailio 5.7.x IP 地址 192.168.43.68 窥视 usrloc 细节 慢慢测试,慢慢写 ul.rm vs ul.rm_contact 这二个不一样,比如 eyebeam 以 1000 注册,同时 microsip 也以 1000 注册 执行 ul.rm location 1000192.168.43.68 就把 eyebea…

作者头像 李华