首页 > 编程语言 >Python-重试任务模块tenacity

Python-重试任务模块tenacity

时间:2024-04-30 09:44:36浏览次数:12  
标签:... task Python stop 重试 running retry tenacity

 

1.软硬件环境

windows 11 64bits

 python 3.6

tenacity

2.简介

在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重试请求的逻辑,直到得到响应或者超时。虽然这样的逻辑并不复杂,但是代码写起来却不那么优雅,不那么pythonic。

tenacity是一个重试库,使用python语言编写,它能够让我们在任务的重试操作中变得非常简单,使用的是Apache 2.0开源协议。

tenacity有如下特性:

(1) 装饰器API

(2) 可指定停止条件

(3) 可指定等待条件

(4) 自定义异常时的重试

(5) 自定义特定返回值的重试

(6) 在协程中使用

3.模块安装

使用pip安装tenacity

pip install tenacity

4.示例代码

(1)无条件重试

这是tenacity最基本的用法,在task方法中使用装饰器@retry,当task出现异常时,我们就重新运行task,这里没加任何限制,如果异常一直出现,task就会一直运行下去

from tenacity import retry

import time

@retry

def task():

    print("task running ... ")

    time.sleep(1)

    raise Exception

task()

执行上述代码,得到

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ... 

task running ...

 

(2)设定停止条件

通过方法stop_after_attempt指定重试的次数,如下的3次。

import time 

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(3))

def task():

    print("task running ... ")

    time.sleep(1)

    raise Exception

task()

重试三次之后就报错了

 

或者使用方法stop_after_delay指定重试多长时候后停止,如下的3秒

from tenacity import retry, stop_after_delay

@retry(stop=stop_after_delay(3))

def task():

    print("task running ... ")

    raise Exception

task()

一直重试很多次,3秒后还没成功,就结束重试

 

还可以将stop_after_delay和stop_after_attempt组合起来用,如下的代码,只要其中一个条件满足,task就停止运行。

import time 

from tenacity import retry, stop_after_attempt, stop_after_delay

@retry(stop=(stop_after_delay(10) | stop_after_attempt(5)))

def task():

    print("task running ... ")

    time.sleep(1)

    raise Exception

task()

 

(3)设定等待时间

使用方法wait_fixed来指定重试时等待的时间,如下代码中的3秒,每一次重试task前都要等待3秒钟

from tenacity import retry, wait_fixed

@retry(wait=wait_fixed(3))

def task():

    print("task running ... ")

    raise Exception

task()

如下,可以看到,每隔3秒重试一次

 

使用方法wait_random(min, max),在min和max之间随机取值,每一次task重试前就等待这个随机值,单位是秒

from tenacity import retry, wait_random

@retry(wait=wait_random(min=1, max=3))

def task():

    print("task running ... ")

    raise Exception

task()

时间有1 2 3s的

 

当然,上面2中种方法也是可以结合起来用的

from tenacity import retry, wait_fixed, wait_random

@retry(wait=wait_fixed(3) + wait_random(0, 2))

def task():

    print("task running ... ")

    raise Exception

task()

 

(4)什么情况下重试

可以通过retry_if_exception_type指定特定类型的异常出现时,任务才重试

from tenacity import retry, retry_if_exception_type

@retry(retry=retry_if_exception_type(IOError))

def task():

    print("task running ... ")

    raise Exception

task()

 

(5)重试错误后的异常抛出

出现异常后,会进行重试,若重试后还是失败,默认情况下,往上抛出的异常会变成RetryError,而不是最根本的原因。因此可以加一个参数reraise=True,使得当重试失败后,往外抛出的异常还是原来的那个异常。

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(3), reraise=True)

def task():

    print("task running ... ")

    raise Exception

task()

 默认是false,false是重试错误

 

(6)在重试前执行动作

tenacity可以在任务重试前后执行某些动作,这里以加日志为例

from tenacity import retry, stop_after_attempt, before_log

import logging

import sys

logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

logger = logging.getLogger(__name__)

@retry(stop=stop_after_attempt(3), before=before_log(logger=logger, log_level=logging.DEBUG))

def task():

    print("task running ... ")

    raise Exception

task()

 

 tenacity重试后的操作类似,如下

from tenacity import retry, stop_after_attempt, after_log

import logging

import sys

logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

logger = logging.getLogger(__name__)

@retry(stop=stop_after_attempt(3), after=after_log(logger=logger, log_level=logging.DEBUG))

def task():

    print("task running ... ")

    raise Exception

task()

标签:...,task,Python,stop,重试,running,retry,tenacity
From: https://www.cnblogs.com/yeyuzhuanjia/p/18167166

相关文章

  • 社会网络分析及其Python实现
    社会网络分析(SocialNetworkAnalysis,SNA)在人类学、心理学、社会学、数学以及统计学等领域中发展起来,是综合运用图论、数学模型来研究社会行动者之间的关系或通过这些关系流动的各种有形或无形的东西,如信息、资源等,近年来逐渐成为一种热门的社会科学研究方法。社会网络分析旨在......
  • python3解析FreeSWITCH会议室列表信息
    操作系统:CentOS7.6_x64FreeSWITCH版本:1.10.9 Python版本:3.9.12进行FreeSWITCH会议室相关功能开发过程中,会遇到需要解析会议室列表信息并进行特定操作的情况,比如设置特定通道变量、发送dtmf、录音等。今天整理下CentOS7环境下,使用Python3解析FreeSWITCH会议室列表信息然后......
  • HydroOJ 从入门到入土(17)批量转化其他格式题库(Python)
    新题库,新快乐,新痛苦。一、想法有了多种题库之后,常常会遇到大量题库无法转化到自己的OJ上。每次都要重新手写解析器,非常浪费时间,于是抽出了这个工具。本工具可以将抽取好的信息自动组装成符合HydroOJ格式的题目并自动压缩,解决后半部分的转化工作。二、实现1.准备包和相......
  • Python 学习笔记
    1、Python简介设计哲学:强调代码的可读性和简洁的语法(尤其是用空格缩进来定义代码块,而不是使用大括号或关键词)。应用领域:Web开发、数据科学、人工智能、科学计算、自动化脚本等。参考文档:Python简介2.基本语法解释器:Python代码可以通过Python解释器直接运行,也可以作为脚本......
  • 【Python】Q-Learning处理CartPole-v1
    上一篇配置成功gym环境后,就可以利用该环境做强化学习仿真了。这里首先用之前学习过的qlearning来处理CartPole-v1模型。CartPole-v1是一个倒立摆模型,目标是通过左右移动滑块保证倒立杆能够尽可能长时间倒立,最长步骤为500步。模型控制量是左0、右1两个。模型状态量为下面四个:......
  • 深入理解Python多进程:从基础到实战
    title:深入理解Python多进程:从基础到实战date:2024/4/2920:49:41updated:2024/4/2920:49:41categories:后端开发tags:并发编程多进程管理错误处理资源调度性能优化异步编程Python并发库引言在Python编程中,多进程是一种重要的并发编程方式,可以让我们充分......
  • Python 编程
    第1章什么是Python?#Python——编程新手最好的选择第2章为Python做好准备#单行注释打印出单词"HelloWorld"print("HelloWorld")'''多行注释这是一条注释这也是一条注释'''print("HelloPython")第3章变量和操作符的世界3.......
  • Python: download file
     defgetLink(url:str):""":paramurl::return:"""headers={'Accept-Language':'zh-CN,zh;q=0.9,en-CN;q=0.8,en;q=0.7,zh-TW;q=0.6','Cookie':'......
  • [Python急救站]基于Transformer Models模型完成GPT2的学生AIGC学习训练模型
    为了AIGC的学习,我做了一个基于TransformerModels模型完成GPT2的学生AIGC学习训练模型,指在训练模型中学习编程AI。在编程之前需要准备一些文件:首先,先win+R打开运行框,输入:PowerShell后输入:pipinstall-Uhuggingface_hub下载完成后,指定我们的环境变量:$env:HF_ENDPOINT="ht......
  • 马斯克突击访华;谷歌 Python 基础团队全数被裁;丨 RTE 开发者日报 Vol.195
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......