Python使用没有装饰器的坚韧性重试

时间:2018-11-24 19:13:25

标签: python python-2.7

我正在尝试使用韧性(没有装饰器)进行重试。我的代码看起来像here中所述。

import logging
from tenacity import retry
import tenacity


def print_msg():
    try:
        logging.info('Hello')
        logging.info("World")
        raise Exception('Test error')
    except Exception as e:
        logging.error('caught error')
        raise e


if __name__ == '__main__':
    logging.basicConfig(
        format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
        datefmt='%d-%m-%Y:%H:%M:%S',
        level=logging.INFO)
    logging.info('Starting')
    try:
        r = tenacity.Retrying(
            tenacity.stop_after_attempt(2),
            tenacity.wait_incrementing(start=10, increment=100, max=1000),
            reraise=True
        )
        try:
            r.call(print_msg)
        except Exception:
            logging.error('Test error 2')
    except Exception:
        logging.error('Received Exception')

执行上述代码时。输出如下所示,无重试

/Users/dmanna/PycharmProjects/demo/venv/bin/python /Users/dmanna/PycharmProjects/demo/retrier.py
25-11-2018:00:29:47,140 INFO     [retrier.py:21] Starting
25-11-2018:00:29:47,140 INFO     [retrier.py:8] Hello
25-11-2018:00:29:47,140 INFO     [retrier.py:9] World
25-11-2018:00:29:47,140 ERROR    [retrier.py:12] caught error
25-11-2018:00:29:47,141 ERROR    [retrier.py:31] Test error 2

Process finished with exit code 0

有人可以让我知道发生了什么问题吗,因为我没有在上面的代码中看到任何重试?

2 个答案:

答案 0 :(得分:0)

已回答here。交叉发布答案

  

哼,我认为您在此处使用的API不正确:

r = tenacity.Retrying(
            tenacity.stop_after_attempt(2),
            tenacity.wait_incrementing(start=10, increment=100, max=1000),
            reraise=True
        )
     

这意味着:

r = tenacity.Retrying(
            sleep=tenacity.stop_after_attempt(2),
            stop=tenacity.wait_incrementing(start=10, increment=100, max=1000),
            reraise=True
        )
     

哪个都不打算做你想做的事。

     

您要

r = tenacity.Retrying(
            stop=tenacity.stop_after_attempt(2),
            wait=tenacity.wait_incrementing(start=10, increment=100, max=1000),
            reraise=True
        )

答案 1 :(得分:0)

对于Python 3.4+用户(支持批注)的注释,要显式强制进行Tenacity重试,一般用例是使用简单的@retry对其进行注释,然后引发特殊的异常TryAgain

@retry
def do_something():
    result = something_else()
    if result == 23:
       raise TryAgain

也可以实现类似于Python 2.7 on this page的答案:

import tenacity

def do_something():
    result = something_else()
    if result == 23:
       raise TryAgain

r = tenacity.Retrying(
        stop=tenacity.stop_after_attempt(2),
        wait=tenacity.wait_incrementing(start=10, increment=100, max=1000)
    )
r.wraps(do_something)

有关更多详细信息,请参见API documentation on whether to retrysource that defines annotations