python中tenacity的用法浅析
背景
最近研读OpenStack相关代码,发现了这个tenacity这个好玩的包,能够在异常或者不满足条件的情况下自动重试函数,只需要一个装饰器即可搞定,很任性。
Google了一下相关资料,写个博客以做记录。
场景
拿Heat中一段代码做解释: 代码如下: 示例代码
@tenacity.retry(
stop=tenacity.stop_after_attempt(
max(cfg.CONF.client_retry_limit + 1, 0)),
retry=tenacity.retry_if_exception(
client_plugin.retry_if_connection_err),
reraise=True)
def get_server(self, server):
"""Return fresh server object.
Substitutes Nova's NotFound for Heat's EntityNotFound,
to be returned to user as HTTP error.
"""
try:
return self.client().servers.get(server)
except exceptions.NotFound:
raise exception.EntityNotFound(entity='Server', name=server)
stop=
是retry退出的条件
retry=
是retry执行的条件
reraise=
是是否在retry退出时跑出异常。
在本段代码中,tenacity.retry的作用是:当client_plugin.retry_if_connection_err执行为true时,则重试调用get_server函数,重试次数由max(cfg.CONF.client_retry_limit + 1, 0)指定,如果达到重试次数后仍然不成功,则抛出异常。