Skip to content

Custom Wait Strategies

Create custom wait generators for specialized retry patterns.

Wait Generator Interface

A wait generator is a function that yields wait times in seconds:

def my_wait_gen():
    """Yields: 1, 2, 3, 4, 5, 5, 5, ..."""
    for i in range(1, 6):
        yield i
    while True:
        yield 5

@backoff.on_exception(my_wait_gen, Exception)
def my_function():
    pass

Parameters

Accept parameters to customize behavior:

def linear_backoff(start=1, increment=1, max_value=None):
    """Linear backoff: start, start+increment, start+2*increment, ..."""
    value = start
    while True:
        if max_value and value > max_value:
            yield max_value
        else:
            yield value
            value += increment

@backoff.on_exception(
    linear_backoff,
    Exception,
    start=2,
    increment=3,
    max_value=30
)
def my_function():
    pass

Examples

Polynomial Backoff

def polynomial_backoff(base=2, exponent=2, max_value=None):
    """Polynomial: base^(tries^exponent)"""
    n = 1
    while True:
        value = base ** (n ** exponent)
        if max_value and value > max_value:
            yield max_value
        else:
            yield value
        n += 1

@backoff.on_exception(polynomial_backoff, Exception, base=2, exponent=1.5)

Stepped Backoff

def stepped_backoff(steps):
    """Different wait times for different ranges
    steps = [(3, 1), (5, 5), (None, 10)]  # 3 tries at 1s, next 5 at 5s, rest at 10s
    """
    for max_tries, wait_time in steps:
        if max_tries is None:
            while True:
                yield wait_time
        else:
            for _ in range(max_tries):
                yield wait_time

@backoff.on_exception(
    stepped_backoff,
    Exception,
    steps=[(3, 1), (3, 5), (None, 30)]
)

Random Backoff

import random

def random_backoff(min_wait=1, max_wait=60):
    """Random wait between min and max"""
    while True:
        yield random.uniform(min_wait, max_wait)

@backoff.on_exception(random_backoff, Exception, min_wait=1, max_wait=10)

Time-of-Day Aware

from datetime import datetime

def business_hours_backoff():
    """Shorter waits during business hours"""
    while True:
        hour = datetime.now().hour
        if 9 <= hour < 17:
            yield 5  # 5 seconds during business hours
        else:
            yield 60  # 1 minute otherwise

@backoff.on_exception(business_hours_backoff, Exception)