python 错误自动重新执行,python 重试

  python 错误自动重新执行,python 重试

  本文主要介绍retrying,这是一个可以在python中自动重试异常的库。retrying是用Python写的一个极小的库,需要更多相关主题的朋友可以参考一下。

  00-1010 1、前言2、快速入门2.1、安装重试2.2、模拟无限重试2.3、模拟最大重试次数2.4、模拟最大重试时间2.5、模拟重试间隔2.6、指定重试调用方法2.7、指定重试异常类型2.8、指定重试特定条件。

  

目录

  在我们的日常开发工作中,为了代码的健壮性,我们通常会尝试——除了方法中的业务代码,防止出现异常时进程被中断。如果出了问题,我们该怎么办?学生可能会用自己的方式(循环)再试一次,那么有没有一个通用可靠的方法可以再试一次呢?答案是肯定的,是重试库。今天就来看看吧。

  

1、前言

  Retrying是一个用Python写的极简库,有1.8k库可以实现方法的异常重试。在实际使用中,我们可以简单地在方法中添加一个@retry装饰器。

  

2、快速开始

  pip安装重试

  

2.1、安装retrying

  假设我们现在有一个方法demo1,其中调用了另一个接口e1,但是被调用的e1接口不稳定。当e1接口返回异常时,我们需要再试一次。

  从重试导入重试

  导入时间

  #将返回异常的接口e1

  def e1():

  时间.睡眠(1)

  打印(错误)

  #我们抛出一个异常来模拟接口异常

  提升类型错误

  #全局计数器

  a=1

  @重试

  def demo1(n):

  #在方法中调用全局变量,并且global是必需的。

  全球a

  #尝试-除了

  尝试:

  打印(f 开始尝试!{a} )

  a=1

  e1()

  e:除外

  打印(e)

  #当重试不成功时,将返回超时。

  引发超时错误

  if __name__==__main__:

  演示1(0)

  代码执行结果:

  你会发现我们的代码将被重试。为什么?

  默认的重试装饰器是无限期地重试,直到重试成功。因为我们的接口e1总是返回一个异常,这个重试将永远持续下去。

  我们将e1方法修改如下,在第10次重试时可以成功:

  #将返回异常的接口e1

  def e1():

  时间.睡眠(1)

  打印(错误)

  #当重试次数达到10次时,返回True

  如果a=10:

  打印(好的!)

  返回True

  #我们抛出一个异常来模拟接口异常

  提升类型错误

  代码执行结果:

  试试!一个

  犯罪

  试试!2

  犯罪

  试试!三

  犯罪

  试试!四

  犯罪

  试试!五

  犯罪

  试试!六

  犯罪

  试试!七

  犯罪

  试试!八

  犯罪

  试试!九

  犯罪

  好吧!

  

2.2、模拟无限重试

  上述无限重试显然在实际业务场景中并不广泛适用。当我们需要限制重试次数时,我们可以使用修饰参数stop _ max _ attempt _ number of retry。

  r来实现。

  

# 全局计数器

  a=1

  @retry(stop_max_attempt_number=3)

  def demo1(n):

      # 方法中调用全局变量,需要global

      global a

      # 进行try-except

      try:

          print(f开始尝试!{a})

          a+=1

          e1()

      except Exception as e:

          print(e)

          # 当重试完成后还未成功,则返回超时

          raise TimeoutError

  以上代码表示,我们只重试3次,如果还未成功,则返回超时异常。

  代码执行结果:

  

  

  

2.4、模拟最大重试时间

  除了可以使用重试次数限制外,当我们对时间要求比较明确的时候,我们就可以使用stop_max_delay参数来指定最大重试时间。这个参数的单位是ms。

  

# 全局计数器

  a=1

  @retry(stop_max_delay=2000)

  def demo1(n):

      # 方法中调用全局变量,需要global

      global a

      # 进行try-except

      try:

          print(f开始尝试!{a})

          a+=1

          e1()

      except Exception as e:

          print(e)

          # 当重试完成后还未成功,则返回超时

          raise TimeoutError

  如上代码表示,当重试时间超过2s就会抛出超时异常。因为在e1方法中,每次调用都会休眠1s,所以对于限制两秒,我们只能在2s内重试2次。

  代码执行结果:

  

  

  

2.5、模拟重试间隔时间

  当我们不希望重试间隔时间太长的时候,我们可以使用参数wait_fixed指定重试的间隔时间。

  

# 全局计数器

  a=1

  @retry(stop_max_delay=6000,wait_fixed=1000)

  def demo1(n):

      # 方法中调用全局变量,需要global

      global a

      # 进行try-except

      try:

          print(f开始尝试!{a})

          a+=1

          e1()

      except Exception as e:

          print(e)

          # 当重试完成后还未成功,则返回超时

          raise TimeoutError

  如上代码表示最大重试时间6秒,重试间隔1秒,但是e1方法中还休眠了1秒,所以在6秒内,我们理论上只能重试4次(不是3次)。

  代码运行结果:

  

  在此基础上,retrying还为我们提供了随机的重试间隔时间参数。

  

  • wait_random_min,重试间隔最小时间
  • wait_random_max,重试间隔最大时间

  一般,这两个参数都是成对出现,用于限制重试间隔时间的范围。

  

  

2.6、指定重试调用的方法

  retrying允许我们在重试的同时去调用一个方法。使用参数stop_func来指定这个方法名。

  

# attempts, delay这两个参数是必填的

  def stop_f(attempts, delay):

      print(发生异常了,正在进行重试!)

  # 全局计数器

  a=1

  @retry(stop_func=stop_f,stop_max_delay=3)

  def demo1(n):

      # 方法中调用全局变量,需要global

      global a

      # 进行try-except

      try:

          print(f开始尝试!{a})

          a+=1

          e1()

      except Exception as e:

          print(e)

          # 当重试完成后还未成功,则返回超时

          raise TimeoutError

  代码运行结果:

  

  

但是stop_func存在一个问题就是和stop_max_delay、stop_max_attempt_number结合使用的时候,后面两者会失效。

  

  

  

2.7、指定重试的异常类型

  当我们需要针对特定的异常才进行重试时,就需要用到这个参数:retry_on_exception

  

  

2.8、指定重试的特定条件

  当达到某个条件才会进行重试,需要使用参数:retry_on_result

  到此这篇关于python中可以发生异常自动重试库retrying的文章就介绍到这了,更多相关python retrying内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: