关于Python错误重试方法总结


Posted in Python onJanuary 03, 2021

前言

Tenacity是一个 Apache 2.0授权的通用重试库,用 Python 编写,用于简化向几乎所有内容添加重试行为的任务。它起源于一个重新尝试的分支,可惜这个分支已经不复存在了。
使用Tenacity可以用来进行测试用例的重跑,爬虫脚本的重跑,以及抢票的失败重抢等等。。。可以使用的场景也是比较多。

使用

首先安装Tenacity

pip install Tenacity

无限重试

第一个重试案例,因为一直是抛出异常错误,所以无限进行重试执行

from tenacity import retry

@retry()
def test_retry():
	print('失败重试中')
 raise Exception
 
test_retry()

关于Python错误重试方法总结

成功则停止

我们来优化成功一次后程序则终止,否则继续重试。

from tenacity import retry
import random

@retry()
def test_retry():
 if random.randint(0,10) > 1:
  print('失败重试中')
  raise Exception
 else:
  print('成功')

test_retry()

关于Python错误重试方法总结

重试次数

毕竟一直重试需要消耗很多资源,所以我们可以设置一些重试的次数,比如在失败多少次后停止重试,不管有没有成功。

from tenacity import retry,stop_after_attempt
import random

@retry(stop=stop_after_attempt(7))
def test_retry():
 # if random.randint(0,10) > 1:
  print('失败重试中')
  raise Exception
 # else:
 #  print('成功')

test_retry()

关于Python错误重试方法总结

重试时间

也可以设置执行的时间

from tenacity import retry,stop_after_attempt,stop_after_delay
import random
from time import sleep
@retry(stop=stop_after_delay(3))
def test_retry():
 # if random.randint(0,10) > 1:
  sleep(1)
  print('失败重试中')
  raise Exception
 # else:
 #  print('成功')

test_retry()

关于Python错误重试方法总结

条件组合

甚至可以使用多个组合条件进行停止,哪个条件先触发则执行哪个

from tenacity import retry,stop_after_attempt,stop_after_delay
import random
from time import sleep
@retry(stop=stop_after_delay(3) | stop_after_attempt(2))
def test_retry():
 # if random.randint(0,10) > 1:
  sleep(1)
  print('失败重试中')
  raise Exception
 # else:
 #  print('成功')

test_retry()

关于Python错误重试方法总结

重试间隔

重试之间的间隔时间太短,所以让我们在重试之间等待2秒钟

from tenacity import retry,stop_after_attempt,stop_after_delay,wait_fixed
import random
import time
@retry(wait=wait_fixed(2))
def test_retry():
 # if random.randint(0,10) > 1:
  print('失败重试中')
  print(time.ctime())
  raise Exception
 # else:
 #  print('成功')

test_retry()

关于Python错误重试方法总结

重试随机间隔

我们还可以设置一些等待时间范围

from tenacity import retry,stop_after_attempt,stop_after_delay,wait_fixed,wait_random
import random
import time
@retry(wait=wait_random(min=1,max=2))
def test_retry():
 # if random.randint(0,10) > 1:
  print('失败重试中')
  print(time.ctime())
  raise Exception
 # else:
 #  print('成功')

test_retry()

关于Python错误重试方法总结

重试前日志

在执行之前打印日志

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,logging.DEBUG))
def test_retry():
 print('失败重试中')
 raise Exception('Fail')

test_retry()

关于Python错误重试方法总结

重试后日志

那么相同的,可以在执行失败后打印日志

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,logging.DEBUG))
def test_retry():
 print('失败重试中')
 raise Exception('Fail')

test_retry()

关于Python错误重试方法总结

基本常用的功能就这些了,如果有需要深入了解的可以访问github地址:https://github.com/jd/tenacity

到此这篇关于关于Python错误重试方法总结的文章就介绍到这了,更多相关Python错误重试方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 元类使用说明
Dec 18 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
基于Pytorch SSD模型分析
Feb 18 Python
django修改models重建数据库的操作
Mar 31 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
Python项目跨域问题解决方案
Jun 22 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
详解python中的异常和文件读写
Jan 03 #Python
python绘制雷达图实例讲解
Jan 03 #Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 #Python
python安装mysql的依赖包mysql-python操作
Jan 01 #Python
python UDF 实现对csv批量md5加密操作
Jan 01 #Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 #Python
python matlab库简单用法讲解
Dec 31 #Python
You might like
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
javascript向flash swf文件传递参数值注意细节
2012/12/11 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
javascript中clone对象详解
2014/12/03 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
canvas时钟效果
2017/02/16 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python调用webservice接口的实现
2019/07/12 Python
CSS3中border-radius属性设定圆角的使用技巧
2016/05/10 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
预备党员表决心的话
2015/09/22 职场文书
SQL Server内存机制浅探
2022/04/06 SQL Server
MySQL新手入门进阶语句汇总
2022/09/23 MySQL