pythonpython-2.7python-tenacity

Python retry using tenacity without decorator


I am trying to do a retry using tenacity (without decorator). My code looks like as explained 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')

On executing the above code. The output looks like below with no retry

/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

Can someone let me know what is going wrong as I am not seeing any retry in the above code?


Solution

  • This has been answered here. Cross posting the answer

    Hum I don't think you're using the API correctly here:

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

    This translates to:

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

    Which is not going to do what you want.

    You want:

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