python-tenacitytenacity

In the tenacity documentation is the retry wait exponential incorrectly documented


In the link https://tenacity.readthedocs.io/en/latest/ the below example states that the wait between retries will be 2*1 (capped at 10 seconds), but should not this be a linear growth when the multiplier is 1.

@retry(wait=wait_exponential(multiplier=1, min=4, max=10))
def wait_exponential_1():
    print("Wait 2^x * 1 second between each retry starting with 4 seconds, then up to 10 seconds, then 10 seconds afterwards")
    raise Exception

Solution

  • The formula is 2^x * multiplier and, in this particular example, the multiplier is 1 (which is a bit confusing for an example).

    Do not mistake the multiplier with the exponent (x): 2^x is still exponentiation.

    Specifically because it uses 2^x, this retry wait is called "binary exponential backoff". (also confusing; in this situation, 2 is the "multiplicative factor" or "base" of exponenation, but that's different than the multiplier argument; multiplication happens after exponentiation)

    So if x is the index of the retry attempt (starting with 0), then the value of 2^x is shown in the second column of the table below...

    Multiply the value of 2^x by either multiplier=1, or 2, or 3, to see how long it will wait before retrying each attempt...

    x 2^x if multiplier is... 1 ...2 ...3
    0 1 then wait ... 1 2 3
    1 2 2 4 6
    2 4 4 8 12
    3 8 8 16 24