详解Python如何优雅的重试
作者:Harpsichord1207
这篇文章主要为大家介绍了Python如何优雅的重试详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
正文
在编码中,一些涉及网络连接的代码片段经常需要重试,本文讲解了如何一步一步实现一个优雅的retry装饰器以及tenacity库的使用。
原始版本v0.0
假如有一个函数形式如下,函数有一些建立网络连接的逻辑
def f():
# do some connections
return 0为了避免偶尔的网络连接失败,需要加上重试机制,那么最简单的形式就是在对应的代码片段加一个循环,循环体里使用异常捕获,连接成功时退出循环,否则就重复执行相关逻辑,此时修改之后的函数f如下
def f():
while 1:
try:
# do some connections
break
except ConnectionError:
continue
return 0装饰器版本v1.0
可以使用装饰器对代码进行抽象。例如现在有两个函数f1和f2需要加上重试机制,写一个名为retry的装饰器函数,用其装饰f1和f2即可。这样做避免了对老代码的修改,同时也实现了代码复用。示例如下
def retry(f):
def wrap(*args, **kwargs):
while 1:
try:
return f(*args, **kwargs)
except ConnectionError:
continue
return wrap
@retry
def f1():
# do some connections
return 0
@retry
def f2():
# do some other connections
return 0带参数的装饰器版本v1.1
v1.0的版本retry装饰器还有一些问题,假如有的函数想重试3次,有的想重试5次,重试的间隔也根据不同函数不一样,v1.0是无法实现的。此时可以借助带参数的三层装饰器,例如以下代码实现的retry装饰器,可以传入times和interval两个参数来设定重试次数和重试间隔
def retry(times, interval):
def decorator(f)
def wrap(*args, **kwargs):
while times:
try:
return f(*args, **kwargs)
except ConnectionError:
times -= 1
time.sleep(interval)
continue
return wrap
return decorator
# 重试3次每次间隔10秒
@retry(times=3, interval=10)
def f1():
# do some connections
return 0
# 重试5次每次间隔15秒
@retry(times=5, interval=15)
def f2():
# do some other connections
return 0装饰器支持参数之后,可以根据需要定义更丰富的参数,比如通过参数来设定需要捕获哪些异常等。
tenacity版本
tenacity是一个第三方开源库,用于函数的重试,实际上它的功能与原理是上面自己写的代码类似的!只是它可定义的参数更丰富,如果不想重复造轮子,拿来直接用就可以。代码示例如下
from tenacity import retry, stop_after_attempt, wait_fixed
# 不带任何参数的重试
@retry
def f():
# do some connections
return 0
# 重试5次每次间隔15秒
@retry(stop=stop_after_attempt(5), wait=wait_fixed(15))
def f():
# do some connections
return 0以上就是详解Python如何优雅的重试的详细内容,更多关于Python优雅重试的资料请关注脚本之家其它相关文章!
