Python
Retry с экспоненциальной задержкой
Универсальный декоратор повторов для нестабильной сети и внешних 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):
...