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)

View source record →

📰 Research Paper
Loading…
⏳ Fetching content…