Python

Retry с экспоненциальной задержкой

Algonexys · 07.08.2026 · 👁 0

Универсальный декоратор повторов для нестабильной сети и внешних API.

Код

import functools
import random
import time


def retry(attempts=3, delay=1.0, backoff=2.0, exceptions=(Exception,)):
    """Повторять вызов при исключении, увеличивая паузу между попытками."""
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            wait = delay
            for attempt in range(1, attempts + 1):
                try:
                    return func(*args, **kwargs)
                except exceptions:
                    if attempt == attempts:
                        raise
                    # jitter защищает от синхронного «стада» повторов
                    time.sleep(wait + random.uniform(0, wait * 0.1))
                    wait *= backoff
        return wrapper
    return decorator


@retry(attempts=5, delay=0.5, exceptions=(ConnectionError, TimeoutError))
def fetch(url):
    ...