20 lines
698 B
Python
20 lines
698 B
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import random
|
|
|
|
|
|
def compute_backoff(base: float, factor: float, jitter_pct: float, max_seconds: float) -> float:
|
|
backoff = min(base * factor, max_seconds)
|
|
jitter = backoff * (jitter_pct / 100.0)
|
|
return max(0.0, random.uniform(backoff - jitter, backoff + jitter))
|
|
|
|
|
|
def next_backoff(current: float, factor: float, jitter_pct: float, max_seconds: float) -> float:
|
|
return compute_backoff(current, factor, jitter_pct, max_seconds)
|
|
|
|
|
|
async def sleep_with_backoff(delay: float, factor: float, jitter_pct: float, max_seconds: float) -> float:
|
|
await asyncio.sleep(delay)
|
|
return next_backoff(delay, factor, jitter_pct, max_seconds)
|