首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自坚韧模块的“重试”不适用于生成器

来自坚韧模块的“重试”不适用于生成器
EN

Stack Overflow用户
提问于 2020-03-24 20:17:54
回答 1查看 994关注 0票数 3

我在使用python3中坚韧库中的"retry“工具时遇到了问题。当我使用生成器.时,“重试”装饰器似乎不起作用。

我有一个代码示例来说明我的情况:

代码语言:javascript
复制
from tenacity import retry, wait_exponential

@retry(wait=wait_exponential(multiplier=1, min=1, max=1))
def test_retry():
print("test retry from tenacity")
for i in range(10):
    if i == 0: raise Exception
    yield i

def gen():
    yield from test_retry()

bar = gen()
for foo in bar:
    print(foo)

当它引发异常时,它不会重试。有人知道为什么这不管用吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-05-03 08:39:48

这是一个错误/特性/困境,它本身具有坚韧性,其中重试逻辑在生成器函数上失败。坚韧的开发者表示,这是因为“发电机内部使用异常。” --最初的开发人员--进一步写道,"tenacity.retry()封装了生成器函数,而不是生成器本身(即用户代码)。“基本上没有任何计划来解决这种行为,如果它甚至可以完成的话。

为了处理这个问题,应该在调用生成器的方法中添加坚韧注释--在这些方法中,当异常在调用堆栈中冒泡时,可以很容易地被坚韧捕获。重要:生成器函数也不能隐藏异常。

代码语言:javascript
复制
# in generator do this and add retry annotations to calling method
...
try: 
    do_something()
except Exception as ex: 
    log_or_do_something_else()
    raise
finally: 
    cleanup()
yield something
...


# in generator don't do this
...
try: 
    do_something()
except Exception as ex: 
    pass
yield something
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60838665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档