如何提高python程序代码的健壮性

简介: 在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢?可能大多数人会想到使用try except来进行异常捕捉进行失败重试(Retry)。虽然try-escept一个非常常见和有效的方式来增强程序稳定性,但是可能一不小心就会造成栈溢出。所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying。

在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢?

可能大多数人会想到使用try  except来进行异常捕捉进行失败重试(Retry)。虽然try-escept一个非常常见和有效的方式来增强程序稳定性,但是可能一不小心就会造成栈溢出。

所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying

定义

在Python生态中,retrying库提供了非常便捷的装饰器和函数来帮助我们轻松添加失败重试机制。它可以自定义重试策略、停止条件、等待间隔等,对各种异常进行捕捉处理。使用retrying可以大大减少我们重复编写失败重试轮询的代码量。

1.下载retrying

pip install retrying

2.无参数重试

我们可以直接在函数上使用装饰器@retry来进行失败重试

import retrying
@retry
def func():
    for item in range(0,100):
        result=item / 0
        print(result)
        return result

func()

但是这种方式并不建议使用,就像上面的代码,我们都知道0作为除数就会报错,在上面的func函数中,因为加了@retry装饰器进行失败重试,这样就就会进入一个死循环一直失败一直重试。

所以我们在进行失败重试的时候最好是需要加上一些参数来限制失败重试。

3.有参数重试

(1)stop_max_attempt_number

在retry中传入stop_max_attempt_number参数后可以指定失败重试的次数

@retry(stop_max_attempt_number=2)
def func():
    print(f"记录失败重试")
    for item in range(0,100):
        result=item / 0
        print(result)
        return result

func()

因为这里我们指定了失败后进行两次重试,如果重试执行两次后还是报错则结束重试,将错误信息抛出来。

1716270626690.jpg

(2)wait_fixed**传入wati_fixed后,可以指定重试的时间

from retrying import retry
import time

# 设置三秒重试一次
@retry(wait_fixed=3000)  
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

1716270669349.jpg

配置重试间隔时间后,成语遇到执行失败或者报错后,就会根据设置的重试时间去进行重试执行

(3)wait_random_minwait_random_max

通常wait_random_min和wait_random_max是一起搭配使用的,可以设置一个重试等待的时间,然后会在设置的时间区间内随机取一个等待时间进行重试

from retrying import retry
import time


@retry(wait_random_min=1000,wait_random_max=9000)
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

1716270702104.jpg

(4)wait_exponential_multiplierwait_exponential_max

官方解释为:以指数的形式产生两次retrying之间的停留时间, 产生的值为2^previous_attempt_number * wait_exponential_multiplier, previous_attempt_number是前面已经retry的次数, 如果产生的这个值超过了wait_exponential_max的大小, 那么之后两个retrying之间的停留值都为wait_exponential_max

通俗来点讲就是每次重试的时间以wait_exponential_multiplier设置的值2,如果重试后还是失败则继续2,直到最后的值等于或则超过wait_exponential_max设置的值后,后面的每一次重试等待时间都是wait_exponential_max设置的值

from retrying import retry
import time

@retry(wait_exponential_multiplier=1000,wait_exponential_max=10000)
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0
    print(result)
    return result

func()

1716270729554.jpg

(5)wait_func

在前面介绍的参数都是如何配置失败冲重试的等待时间或者重试次数之类的,但是我们不能时时刻刻盯着程序,在程序代码发生错误时我们应该要进行发送短信或者邮件之类的提醒才行

在这里就可以使用到wait_func参数,它接收一个可执行函数,返回一个具体的间隔时间数值,单位ms。接收的函数须接收两个参数:attempt_number当前运行次数,delay_since_first_attempt_ms当前重试机制运行时间(单位ms)

from retrying import retry
import time


def func_demo(attempt_number,delay_since_first_attempt_ms):
    print("函数运行失败后运行该函数")

    if attempt_number == 5:
        print("已经重试失败五次了,开始准备发送提醒")

    if attempt_number == 10:
        print("已经重试失败超10次了,发送邮件给相关人员紧急处理")

    if attempt_number >10:
        print("重试时间过长,做一些其他临时方案进行补救")

    # return一个重试的时间
    return 2000


@retry(wait_func=func_demo)
def func():
    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))

    result=1 / 0

    return result

func()

1716270766161.jpg

使用wait_func通过调用其他可执行的函数,我们可以借助它来做一些临时的补救措施,避免程序一直无法运行而产生的影响。

(6)其他参数

在retry中还存在有很多参数,有兴趣的小伙伴可以去详细了解下

1716270780078.jpg

  • stop_max_attempt_number:在停止之前尝试的最大次数,最后一次如果还是有异常则会抛出异常,停止运行,默认为5次
  • stop_max_delay:最大延迟时间,大概意思就是:如果调用的函数出现异常,那么就会重复调用这个函数,最大调用时间,默认为100毫秒
  • wait_fixed:两次调用方法期间停留时长, 如果出现异常则会一直重复调用,默认 1000毫秒
  • wait_random_min:在两次调用方法停留时长,停留最短时间,默认为0
  • wait_random_max:在两次调用方法停留时长,停留最长时间,默认为1000毫秒
  • wait_incrementing_increment:每调用一次则会增加的时长,默认 100毫秒
  • wait_exponential_multiplierwait_exponential_max:以指数的形式产生两次「retrying」之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经「retry」的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个「retrying」之间的停留值都为wait_exponential_max
  • retry_on_exception: 指定一个函数,如果此函数返回指定异常,则会重试,如果不是指定的异常则会退出
  • retry_on_result:指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出
  • wrap_exception:参数设置为True/False,如果指定的异常类型,包裹在RetryError中,会看到RetryError和程序抛的Exception error
  • stop_func: 每次抛出异常时都会执行的函数,如果和stop_max_delay、stop_max_attempt_number配合使用,则后两者会失效 (指定的stop_func会有两个参数:attempts, delay)
  • wait_func:和stop_func用法差不多。


作者:大话性能

链接:https://juejin.cn/post/7371000336683532338

相关文章
|
2天前
|
缓存 开发者 Python
探索Python中的装饰器:简化和增强你的代码
【10月更文挑战第32天】 在编程的世界中,简洁和效率是永恒的追求。Python提供了一种强大工具——装饰器,它允许我们以声明式的方式修改函数的行为。本文将深入探讨装饰器的概念、用法及其在实际应用中的优势。通过实际代码示例,我们不仅理解装饰器的工作方式,还能学会如何自定义装饰器来满足特定需求。无论你是初学者还是有经验的开发者,这篇文章都将为你揭示装饰器的神秘面纱,并展示如何利用它们简化和增强你的代码库。
|
3天前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
20 3
|
5天前
|
设计模式 缓存 测试技术
Python中的装饰器:功能增强与代码复用的艺术####
本文将深入探讨Python中装饰器的概念、用途及实现方式,通过实例演示其如何为函数或方法添加新功能而不影响原有代码结构,从而提升代码的可读性和可维护性。我们将从基础定义出发,逐步深入到高级应用,揭示装饰器在提高代码复用性方面的强大能力。 ####
|
3天前
|
算法 IDE API
Python编码规范与代码可读性提升策略####
本文探讨了Python编码规范的重要性,并深入分析了如何通过遵循PEP 8等标准来提高代码的可读性和可维护性。文章首先概述了Python编码规范的基本要求,包括命名约定、缩进风格、注释使用等,接着详细阐述了这些规范如何影响代码的理解和维护。此外,文章还提供了一些实用的技巧和建议,帮助开发者在日常开发中更好地应用这些规范,从而编写出更加清晰、简洁且易于理解的Python代码。 ####
|
6天前
|
缓存 测试技术 数据安全/隐私保护
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第29天】本文通过深入浅出的方式,探讨了Python装饰器的概念、使用场景和实现方法。文章不仅介绍了装饰器的基本知识,还通过实例展示了如何利用装饰器优化代码结构,提高代码的可读性和重用性。适合初学者和有一定经验的开发者阅读,旨在帮助读者更好地理解和应用装饰器,提升编程效率。
|
8天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
21 3
|
13天前
|
开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第22天】在Python的世界里,装饰器是一个强大的工具,它能够让我们以简洁的方式修改函数的行为,增加额外的功能而不需要重写原有代码。本文将带你了解装饰器的基本概念,并通过实例展示如何一步步构建自己的装饰器,从而让你的代码更加高效、易于维护。
|
10天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
14 3
|
12天前
|
机器学习/深度学习 缓存 数据挖掘
Python性能优化:提升你的代码效率
【10月更文挑战第22天】 Python性能优化:提升你的代码效率
12 1
|
3天前
|
存储 机器学习/深度学习 搜索推荐
Python编程入门:从零开始构建你的第一个程序
【10月更文挑战第32天】本文旨在通过浅显易懂的方式引导编程新手进入Python的世界。我们将一起探索Python的基础语法,并通过实例学习如何构建一个简单的程序。文章将不直接展示代码,而是鼓励读者在阅读过程中自行尝试编写,以加深理解和记忆。无论你是编程初学者还是希望巩固基础知识的开发者,这篇文章都将是你的良师益友。让我们开始吧!

热门文章

最新文章