python - 实施重试例程
问题描述
我有以下想法。是否可以在 python 中实现重试例程?这是我所做的一个简单示例。我想要一个更灵活的解决方案。独立于功能。因此,使用任何其他功能切换 removeFile 并摆脱 main 中的 while 循环。
import os
import time
def removeFile(file):
try:
os.remove(file)
print("removed : "+file)
return True
except PermissionError:
print("could not delete file "+file+" ; will try again")
return False
if __name__ == "__main__":
file = "some_path/file.ext"
sucess = False
maxCount = 5
count = 0
while not sucess:
sucess = removeFile(file)
count += 1
if count == maxCount:
sucess = True
print("could not delete file "+file+" ; permission denied.")
time.sleep(5)
解决方案
感谢@shmee,我得到了一种新方法,使用装饰器。
def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
"""Retry calling the decorated function using an exponential backoff.
http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/
original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry
:param ExceptionToCheck: the exception to check. may be a tuple of
exceptions to check
:type ExceptionToCheck: Exception or tuple
:param tries: number of times to try (not retry) before giving up
:type tries: int
:param delay: initial delay between retries in seconds
:type delay: int
:param backoff: backoff multiplier e.g. value of 2 will double the delay
each retry
:type backoff: int
:param logger: logger to use. If None, print
:type logger: logging.Logger instance
"""
def deco_retry(f):
@wraps(f)
def f_retry(*args, **kwargs):
mtries, mdelay = tries, delay
while mtries > 1:
try:
return f(*args, **kwargs)
except ExceptionToCheck:
msg = "%s, Retrying in %d seconds..." % (str(ExceptionToCheck), mdelay)
if logger:
#logger.exception(msg) # would print stack trace
logger.warning(msg)
else:
print(msg)
time.sleep(mdelay)
mtries -= 1
mdelay *= backoff
return f(*args, **kwargs)
return f_retry # true decorator
return deco_retry
现在剩下要做的就是装饰我们的小删除函数:
@retry(PermissionError, tries=5, delay=2,backoff=2)
def removeFile(f):
os.remove(f)
推荐阅读
- heroku - Python-Telegram 机器人在本地运行,但不在 Heroku 上
- javascript - 将解构的值从一个数组推送到另一个数组
- swift - 自签名证书 Swift 组合
- java - 在给定我的 android 游戏项目(Crossy Road 克隆)中的输出对象的情况下,我在创建对象时遇到问题
- flutter - 如何使用 Flutter 应用程序使用 APP_ID、APP_KEY 和 APP_SECRET 连接到 Web 套接字
- sql - 获取“无法添加或更新子行:外键约束失败”
- django - 我无法循环遍历我的 ids 参数,如何接收和循环遍历
- arrays - Clickhouse:计算两个日期之间的差异,不包括某些日子(但不包括周末!)
- navigation - 标题菜单无功能且仅在移动设备上闪烁
- segment-io - 如何访问 segment.io 跟踪/页面调用的 messageID?