0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 在什么情况下才进行重试

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-21 11:18 次阅读

为了避免由于一些网络或等其他不可控因素,而引起的功能性问题。比如在发送请求时,会因为网络不稳定,往往会有请求超时的问题。

这种情况下,我们通常会在代码中加入重试的代码。重试的代码本身不难实现,但如何写得优雅、易用,是我们要考虑的问题。

这里要给大家介绍的是一个第三方库 - Tenacity (标题中的重试机制并并不准确,它不是 Python 的内置模块,因此并不能称之为机制),它实现了几乎我们可以使用到的所有重试场景,比如:

  1. 在什么情况下才进行重试?
  2. 重试几次呢?
  3. 重试多久后结束?
  4. 每次重试的间隔多长呢?
  5. 重试失败后的回调?

在使用它之前 ,先要安装它

$ pip install tenacity

1. 最基本的重试

无条件重试,重试之间无间隔

from tenacity import retry

@retry
def test_retry():
    print("等待重试,重试无间隔执行...")
    raise Exception

test_retry()

无条件重试,但是在重试之前要等待 2 秒

from tenacity import retry, wait_fixed

@retry(wait=wait_fixed(2))
def test_retry():
    print("等待重试...")
    raise Exception

test_retry()

2. 设置停止基本条件

只重试7 次

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(7))
def test_retry():
    print("等待重试...")
    raise Exception

test_retry()

重试 10 秒后不再重试

from tenacity import retry, stop_after_delay

@retry(stop=stop_after_delay(10))
def test_retry():
    print("等待重试...")
    raise Exception

test_retry()

或者上面两个条件满足一个就结束重试

from tenacity import retry, stop_after_delay, stop_after_attempt

@retry(stop=(stop_after_delay(10) | stop_after_attempt(7)))
def test_retry():
    print("等待重试...")
    raise Exception

test_retry()

3. 设置何时进行重试

在出现特定错误/异常(比如请求超时)的情况下,再进行重试

from requests import exceptions
from tenacity import retry, retry_if_exception_type

@retry(retry=retry_if_exception_type(exceptions.Timeout))
def test_retry():
    print("等待重试...")
    raise exceptions.Timeout

test_retry()

在满足自定义条件时,再进行重试。

如下示例,当 test_retry 函数返回值为 False 时,再进行重试

from tenacity import retry, stop_after_attempt, retry_if_result

def is_false(value):
    return value is False

@retry(stop=stop_after_attempt(3),
       retry=retry_if_result(is_false))
def test_retry():
    return False

test_retry()

4. 重试后错误重新抛出

当出现异常后,tenacity 会进行重试,若重试后还是失败,默认情况下,往上抛出的异常会变成 RetryError,而不是最根本的原因。

因此可以加一个参数reraise=True),使得当重试失败后,往外抛出的异常还是原来的那个。

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(7), reraise=True)
def test_retry():
    print("等待重试...")
    raise Exception

test_retry()

5. 设置回调函数

当最后一次重试失败后,可以执行一个回调函数

from tenacity import *

def return_last_value(retry_state):
    print("执行回调函数")
    return retry_state.outcome.result()  # 表示返回原函数的返回值

def is_false(value):
    return value is False

@retry(stop=stop_after_attempt(3),
       retry_error_callback=return_last_value,
       retry=retry_if_result(is_false))
def test_retry():
    print("等待重试中...")
    return False

print(test_retry())

输出如下

等待重试中...
等待重试中...
等待重试中...
执行回调函数
False
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2696

    浏览量

    47438
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62576
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68539
  • python
    +关注

    关注

    56

    文章

    4793

    浏览量

    84634
收藏 人收藏

    评论

    相关推荐

    请问什么情况下需要使用通信协议

    最近有个客户要做一个串口通信控制LED灯的板子当时它问我要用什么通信协议;我门在学习串口通信时并没有学到什么通信协议把?在网上查了是有一些; 请问:什么情况下需要使用通信协议
    发表于 06-13 04:35

    什么情况下选用PCI板卡?什么情况下选用PXI板卡?

    测控选板卡方案时,什么情况下选PCI,什么情况下选PXI?
    发表于 03-31 20:52

    什么情况下低压线路保护中要求配置零序电流互感器

    什么情况下低压线路保护中要求配置零序电流互感器?如何选择零序电流互感器一次电流值?如何进行安装?定值如何整定?
    发表于 08-09 07:35

    PCB数字地模拟地怎么区分?什么情况下需要模拟地数字地分开?

    画原理图时要考虑模数地分开,怎的需要分开模拟地与数字地..例如PWM控压和AD采集一个电路上,AD采集元器件的值,当值小时增大电压,反之减小电压,这样是不是就要模拟地数字地分开铺地???
    发表于 04-10 14:53

    AD9235-65什么情况下需要单端转差分信号?

    我想用AD9235-65芯片,我的输入信号频率50K左右,输入信号经过滤波后,离AD9235的距离很近,是不是就不需要单端转差分输入了?我的信号本来是单端的。或者更进一步,什么情况下需要单端转差分信号?谢谢!
    发表于 12-14 07:57

    什么情况下数据能恢复和不能恢复

    什么情况下数据能恢复和不能恢复 因数据的破坏复杂多变,数据能否恢复或几率的大小不能一概而论。请查阅本站相关文章了解数
    发表于 03-29 10:42 2832次阅读

    volte语音通话有什么用,什么情况下可以开/关volte

    听很多人都在讲volte高清语音通话那么什么是vote呢?什么情况下需要开通volte呢?什么情况下又可以关闭volte呢?
    发表于 10-21 16:36 1.7w次阅读

    什么情况下使用示波器

    示波器可以把我们看不见的电信号变换成看得见的图像,方便来研究各种电现象的变化过程。那么什么情况下使用示波器呢? 使用示波器进行测量需要涂有荧光物质的屏面、主机、探头配置和稳定的信号。示波器一般都是
    的头像 发表于 02-01 11:00 5715次阅读

    什么情况下进行电能质量检测?

    什么情况下进行电能质量检测?
    发表于 09-08 14:20 686次阅读

    什么情况下选用工业主板

    虽然工业主板和普通主板差异比较多,但是某些情况下工业主板用于商业环境也是可以的,但是实用性不是很好。什么情况下选用工业主板呢?
    的头像 发表于 02-14 10:34 844次阅读
    <b class='flag-5'>什么情况下</b>选用工业主板

    电机什么情况下需要配减速机?

    电机是运动机械的最常用动力源,今天分享什么情况下电机需要配减速机。
    的头像 发表于 05-26 17:47 1907次阅读
    电机<b class='flag-5'>什么情况下</b>需要配减速机?

    应急灯什么情况下才会亮?

    应急灯什么情况下才会亮? 应急灯指的是电源发生故障时,正常照明无法使用的情况下,启动的照明灯。比如说因为火灾导致正常照明系统失效时,消防疏散照明灯、消防应急照明灯会自动亮起,起到疏散人群,提供照明
    的头像 发表于 07-25 13:57 1.5w次阅读

    什么情况下选择热电偶?什么情况下选择热电阻?哪个更合适?

    什么情况下选择热电偶?什么情况下选择热电阻?哪个更合适? 热电偶和热电阻都是温度传感器,用于测量温度。但是它们的原理、特性和应用场景不同。实际选择中,需要根据具体情况,选择更合适的一
    的头像 发表于 10-26 17:47 1687次阅读

    Tenacity重试模块实践

    如何写得优雅、易用,是我们要考虑的问题。 这里要给大家介绍的是一个第三方库 - Tenacity ,它实现了几乎我们可以使用到的所有重试场景,比如: 什么情况下
    的头像 发表于 11-02 11:33 403次阅读

    什么情况下应测量电动机的绝缘电阻?

    什么情况下应测量电动机的绝缘电阻? 电动机的绝缘电阻是指电机绝缘材料的绝缘性能。它是一个重要的参数,用来评估电机绝缘系统的健康状况和预测可能出现的故障。什么情况下应该测量电动机的绝
    的头像 发表于 11-10 14:38 1691次阅读