• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Python中最强大的错误重试库

python 搞java代码 3年前 (2022-07-26) 64次浏览 已收录 0个评论
文章目录[隐藏]

1 简介

咱们在编写程序尤其是与网络申请相干的程序,如调用web接口、运行网络爬虫等工作时,常常会遇到一些偶尔产生的申请失败的情况,这种时候如果咱们仅仅简略的捕获谬误而后跳过对应工作,必定是不谨严的,尤其是在网络爬虫中,会存在损失有价值数据的危险。

这类状况下咱们就很有必要为咱们的程序逻辑增加一些「谬误重试」的策略,费老师我在几年前写过文章介绍过Python中的retry库,但它性能较为繁多,只能应答根本的需要。

而明天我要给大家介绍的tenacity库,可能是目前Python生态中最好用的谬误重试库,上面就让咱们一睹其次要性能吧~

2 tenacity中的罕用性能

作为一个第三方Python库,咱们能够应用pip install tenacity对其进行装置,装置实现后,上面咱们来学习一下tenacity的次要应用办法和个性:

2.1 tenacity的根底应用

tenacity的谬误重试外围性能由其retry装璜器来实现,默认不给retry装璜器传参数时,它会在其所装璜的函数运行过程抛出谬误时不停地重试上来,譬如上面这个简略的例子:

import random
from tenacity import retry

@retry
def demo_func1():

    a = random.random()
    print(a)
    
    if a >= 0.1:
        raise Exception

demo_func1()

能够看到,咱们的函数体内每次生成0到1之间的随机数,当这个随机数不超过0.1时才会进行抛出谬误,否则则会被tenacity捕捉到每次的谬误抛出行为并立刻重试。

2.2 设置最大重试次数

有些时候咱们对某段函数逻辑谬误重试的忍受是有限度的,譬如当咱们调用某个网络接口时,如果间断n次都执行失败,咱们可能就会认为这个工作自身就存在缺点,不是通过重试就能有朝一日失常的。

这种时候咱们能够利用tenacity中的stop_after_attempt函数,作为retry()中的stop参数传入,从而为咱们“无尽”的谬误重试过程增加一个起点,其中stop_after_attempt()承受一个整数输出作为「最大重试」的次数:

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(3))
def demo_func2():
    
    print('函数执行')
    
    raise Exception
    
demo_func2()

能够看到,咱们的函数在限度了最大重试次数后,通过3次重试,在第4次继续执行仍然抛出谬误后,正式地抛出了函数中对应的Exception谬误完结了重试过程。

2.3 设置重试最大超时时长

咱们除了像上一大节中那样设置最大谬误重试的次数之外,tenacity还为咱们提供了stop_after_delay()函数来设置整个重试过程的最大耗时,超出这个时长也会完结重试过程:

import time
from tenacity import retry, stop_after_delay

# 设置重试最大超时时长为5秒
@retry(stop=stop_after_delay(5))
def demo_func3():
    
    time.sleep(1)
    print(f'已过来 {time.time() - start_time} 秒')
    
    raise Exception

# 记录开始工夫
start_time = time.time()
demo_func3()

2.4 组合重试进行条件

如果咱们的工作同时须要增加最大重试次数以及最大超时时长限度,在tenacity中仅须要用|运算符组合不同的限度条件再传入retry()stop参数即可,譬如上面的例子,当咱们的函数执行重试超过3秒或次数大于5次时均能够完结重试:

import time
import random
from tenacity import retry, stop_after_delay, stop_after_attempt

@retry(stop=(stop_after_delay(3) | stop_after_attempt(5)))
def demo_func4():
    
    time.sleep(random.random())
    print(f'已过来 {time.time() - start_time} 秒')
    
    raise Exception

# 记录开始工夫
start_time = time.time()
demo_func4()

能够看到,在下面的演示中,先达到了“最大重试5次”的限度从而完结了重试过程。

2.5 设置相邻重试之间的工夫距离

有些状况下咱们并不心愿每一次重试抛出谬误后,立刻开始下一次的重试,譬如爬虫工作中为了更好地假装咱们的程序,tenacity中提供了一系列十分实用的函数,配合retry()wait参数,帮忙咱们妥善处理相邻重试之间的工夫距离,其中较为实用的次要有以下两种形式:

2.5.1 设置固定工夫距离

咱们通过应用tenacity中的wait_fixed()能够为相邻重试之间设置固定的期待距离秒数,就像上面的简略示例那样:

import time
from tenacity import retry, wait_fixed, stop_after_attempt

# 设置重试期待距离为1秒
@retry(wait=wait_fixed(1), stop=stop_after_attempt(3))
def demo_func5():
    
    print(f'已过来 {time.time() - start_time} 秒')
    
    raise Exception
    
# 记录开始工夫
start_time = time.time()
demo_func5()

2.5.2 设置随机工夫距离

除了设置固定的工夫距离外,tenacity还能够通过wait_random()帮忙咱们为相邻重试设置均匀分布随机数,只须要设置好均匀分布的范畴即可:

import time
from tenacity import retry, wait_random, stop_after_attempt

# 设置重试期待距离为1到3之间的随机数
@retry(wait=wait_random(min=1, max=3), stop=stop_after_attempt(5))
def demo_func6():
    
    print(f'已过来 {time.time() - start_time} 秒')
    
    raise Exception

# 记录开始工夫
start_time = time.time()
demo_func6()

能够察看到,每一次重试后的期待时长都是随机的~

2.6 自定义是否触发重试

tenacityretry()的默认策略是当其所装璜的函数执行过程“抛出任何谬误”时即进行重试,但有些状况下咱们须要的可能是对特定谬误类型的捕获/疏忽,亦或是对异样计算结果的捕获。

tenacity中同样内置了相干的实用功能:

2.6.1 捕获或疏忽特定的谬误类型

应用tenacity中的retry_if_exception_type()retry_if_not_exception_type(),配合retry()retry参数,咱们能够对特定的谬误类型进行捕获或疏忽:

from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type

@retry(retry=retry_if_exception_type(FileExistsError))
def demo_func7():
    
    raise TimeoutError
    
@retry(retry=retry_if_not_exception_type(FileNotFoundError))
def demo_func8():

    raise FileNotFoundError

2.6.2 自定义函数后果条件判断函数

咱们能够编写额定的条件判断函数,配合tenacity中的retry_if_result(),实现对函数的返回后果进行自定义条件判断,返回True时才会触发重试操作:

import random
from tenacity import retry, retry_if_result

@retry(retry=retry_if_result(lambda x: x >= 0.1))
def demo_func9():
    a = random.random()
    print(a)
    return a

# 记录开始工夫
demo_func9()

2.7 对函数的谬误重试状况进行统计

tenacityretry()装璜的函数,咱们能够打印其retry.statistics属性查看其历经的谬误重试统计记录后果,譬如这里咱们对后面执行过的示例函数demo_func9()的统计后果进行打印:

demo_func9.retry.statistics

除了上述的性能之外,tenacity还具备很多非凡的个性,能够联合logging模块、异步函数、协程等其余Python性能实现更高级的性能,感兴趣的敌人能够返回https://github.com/jd/tenacity理解更多。

以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Python中最强大的错误重试库

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址