tenacity icon indicating copy to clipboard operation
tenacity copied to clipboard

Reset Retry State

Open developing-coder opened this issue 4 years ago • 2 comments

@tenacity.retry(
    wait=tenacity.wait_exponential(),
    before_sleep=do_some_logging
)
def fetch_data_from_server():
    ...

Let's assume that fetch_data_from_server fails and retry interval increases to 512 seconds. Now the server connection comes back and everything continues as expected. After a while a second outage occurs and on first retry the interval is already 1028 seconds. Is it possible to reset retry state after success after first outage?

Thanks

developing-coder avatar Apr 13 '20 16:04 developing-coder

Here's a simplified example of what I'm trying to achieve.

import tenacity
from queue import Queue

def log(retry_state):
    print(retry_state.attempt_number)

@tenacity.retry(wait=tenacity.wait_exponential(), before_sleep=log)
def do_something(q):
    while True:
        if not q.get():
            raise ValueError()

if __name__ == '__main__':

    my_q = Queue()
    my_q.put(False)
    my_q.put(True)
    my_q.put(False)
    do_something(my_q)

Output.

1
2

Desired output.

1
1

developing-coder avatar Apr 14 '20 07:04 developing-coder

I had some luck implementing this using Retrying context manager. To give you an idea here's the sample code:

import random
from datetime import datetime

from tenacity import Retrying, wait_exponential, RetryCallState


def generator():
    while True:
        if random.uniform(1, 2) < 1.5:
            raise RuntimeError()
        yield f"{datetime.now()} tick"


def on_retry_warning(rs: RetryCallState):
    print(f"{datetime.now()} retrying in {rs.next_action.sleep:.2f}s")


for attempt in Retrying(wait=wait_exponential(max=4), before_sleep=on_retry_warning):
    with attempt:
        for v in generator():
            print(v)
            attempt.retry_state.attempt_number = 1

Output:

2021-09-06 23:07:43.146584 retrying in 1.00s
2021-09-06 23:07:44.147774 retrying in 2.00s
2021-09-06 23:07:46.149067 tick
2021-09-06 23:07:46.149106 tick
2021-09-06 23:07:46.149190 retrying in 1.00s
2021-09-06 23:07:47.150542 retrying in 2.00s
2021-09-06 23:07:49.152919 retrying in 4.00s
2021-09-06 23:07:53.157237 retrying in 4.00s
2021-09-06 23:07:57.161588 retrying in 4.00s
2021-09-06 23:08:01.165892 tick
2021-09-06 23:08:01.165938 tick
2021-09-06 23:08:01.166036 retrying in 1.00s
2021-09-06 23:08:02.167314 tick
2021-09-06 23:08:02.167446 retrying in 1.00s
2021-09-06 23:08:03.168734 tick
2021-09-06 23:08:03.168781 tick
2021-09-06 23:08:03.168789 tick
2021-09-06 23:08:03.168890 retrying in 1.00s
2021-09-06 23:08:04.169192 retrying in 2.00s
2021-09-06 23:08:06.171569 retrying in 4.00s
2021-09-06 23:08:10.173146 retrying in 4.00s
2021-09-06 23:08:14.177496 retrying in 4.00s
2021-09-06 23:08:18.181131 retrying in 4.00s
2021-09-06 23:08:22.185019 tick
2021-09-06 23:08:22.185068 tick
2021-09-06 23:08:22.185075 tick
2021-09-06 23:08:22.185166 retrying in 1.00s
2021-09-06 23:08:23.186330 tick
2021-09-06 23:08:23.186368 tick
2021-09-06 23:08:23.186376 tick
2021-09-06 23:08:23.186381 tick
2021-09-06 23:08:23.186457 retrying in 1.00s
2021-09-06 23:08:24.187638 tick
2021-09-06 23:08:24.187798 retrying in 1.00s
2021-09-06 23:08:25.188995 tick
2021-09-06 23:08:25.189043 tick
2021-09-06 23:08:25.189147 retrying in 1.00s
2021-09-06 23:08:26.190398 retrying in 2.00s
2021-09-06 23:08:28.192694 tick
2021-09-06 23:08:28.192821 retrying in 1.00s
2021-09-06 23:08:29.193093 tick
2021-09-06 23:08:29.193223 retrying in 1.00s
2021-09-06 23:08:30.194573 retrying in 2.00s
2021-09-06 23:08:32.196914 retrying in 4.00s
2021-09-06 23:08:36.201281 retrying in 4.00s

alekna avatar Sep 06 '21 22:09 alekna