当前位置:首页 > 科技  > 软件

Python系列:如何提高python程序代码的健壮性

来源: 责编: 时间:2023-11-17 17:13:58 357观看
导读前言在编程的时候,我们难免会遇到一些不可靠的情况,比如网络请求失败,数据库连接超时等等。这些不确定性会让我们的程序容易出现各种错误和异常。那么如何来增加程序的容错性和健壮性呢?可能大多数人会想到使用try e

前言

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

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

所以接下来我就来介绍一个另外的一个专门用于失败重试的库:retrying。iPx28资讯网——每日最新资讯28at.com

iPx28资讯网——每日最新资讯28at.com

定义

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

1.下载retrying

pip install retrying

2.无参数重试

我们可以直接在函数上使用装饰器@retry来进行失败重试iPx28资讯网——每日最新资讯28at.com

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

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

所以我们在进行失败重试的时候最好是需要加上一些参数来限制失败重试。iPx28资讯网——每日最新资讯28at.com

3.有参数重试

(1) stop_max_attempt_numberiPx28资讯网——每日最新资讯28at.com

在retry中传入stop_max_attempt_number参数后可以指定失败重试的次数iPx28资讯网——每日最新资讯28at.com

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

因为这里我们指定了失败后进行两次重试,如果重试执行两次后还是报错则结束重试,将错误信息抛出来。iPx28资讯网——每日最新资讯28at.com

iPx28资讯网——每日最新资讯28at.com

(2) wait_fixed传入wati_fixed后,可以指定重试的时间iPx28资讯网——每日最新资讯28at.com

from retrying import retryimport time# 设置三秒重试一次@retry(wait_fixed=3000)  def func():    print(f"记录失败重试:",time.strftime("%Y-%m-%d %H:%M:%S"))    result=1 / 0    print(result)    return resultfunc()

iPx28资讯网——每日最新资讯28at.com

配置重试间隔时间后,成语遇到执行失败或者报错后,就会根据设置的重试时间去进行重试执行iPx28资讯网——每日最新资讯28at.com

(3) wait_random_min和wait_random_maxiPx28资讯网——每日最新资讯28at.com

通常wait_random_min和wait_random_max是一起搭配使用的,可以设置一个重试等待的时间,然后会在设置的时间区间内随机取一个等待时间进行重试iPx28资讯网——每日最新资讯28at.com

from retrying import retryimport 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 resultfunc()

iPx28资讯网——每日最新资讯28at.com

(4) wait_exponential_multiplier和wait_exponential_maxiPx28资讯网——每日最新资讯28at.com

官方解释为:以指数的形式产生两次retrying之间的停留时间, 产生的值为2^previous_attempt_number * wait_exponential_multiplier, previous_attempt_number是前面已经retry的次数, 如果产生的这个值超过了wait_exponential_max的大小, 那么之后两个retrying之间的停留值都为wait_exponential_maxiPx28资讯网——每日最新资讯28at.com

通俗来点讲就是每次重试的时间以wait_exponential_multiplier设置的值2,如果重试后还是失败则继续2,直到最后的值等于或则超过wait_exponential_max设置的值后,后面的每一次重试等待时间都是wait_exponential_max设置的值iPx28资讯网——每日最新资讯28at.com

from retrying import retryimport 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 resultfunc()

iPx28资讯网——每日最新资讯28at.com

(5)wait_funciPx28资讯网——每日最新资讯28at.com

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

在这里就可以使用到wait_func参数,它接收一个可执行函数,返回一个具体的间隔时间数值,单位ms。接收的函数须接收两个参数:attempt_number当前运行次数,delay_since_first_attempt_ms当前重试机制运行时间(单位ms)iPx28资讯网——每日最新资讯28at.com

from retrying import retryimport timedef 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 resultfunc()

iPx28资讯网——每日最新资讯28at.com

使用wait_func通过调用其他可执行的函数,我们可以借助它来做一些临时的补救措施,避免程序一直无法运行而产生的影响。iPx28资讯网——每日最新资讯28at.com

(6) 其他参数iPx28资讯网——每日最新资讯28at.com

在retry中还存在有很多参数,有兴趣的小伙伴可以去详细了解下iPx28资讯网——每日最新资讯28at.com

iPx28资讯网——每日最新资讯28at.com

  • 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_multiplier和wait_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用法差不多。

本文链接:http://www.28at.com/showinfo-26-27967-0.htmlPython系列:如何提高python程序代码的健壮性

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 在GORM中使用并发

下一篇: C++智能指针enable_shared_from_this

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、“Ringdoll戒之人形”淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
Top