INNER CODE UNIT · Python
backoff
trevorhobenshield/twitter-api-client · scripts/update.py:114
async def backoff(fn: callable, sem: Semaphore, *args, m: int = 20, b: int = 2, max_retries: int = 8, **kwargs) -> any:
ignore_status_codes = kwargs.pop('ignore_status_codes', [])
for i in range(max_retries + 1):
try:
async with sem:
r = await fn(*args, **kwargs)
if r.status_code in ignore_status_codes:
return r
r.raise_for_status()
return r
except Exception as e:
if i == max_retries:
logger.warning(f'Max retries exceeded\n{e}')
return
t = min(random.random() * (b ** i), m)
logger.info(f'Retrying in {f"{t:.2f}"} seconds\n{e}')
await asyncio.sleep(t)