| #!/usr/bin/env python |
| |
| from __future__ import print_function |
| |
| import traceback |
| import logging |
| import time |
| import random |
| import sys |
| |
| def retry(ExceptionToCheck, tries=10, timeout_secs=1.0, logger=None): |
| """ |
| Retry calling the decorated function using an exponential backoff. |
| """ |
| def deco_retry(f): |
| def f_retry(*args, **kwargs): |
| mtries, mdelay = tries, timeout_secs |
| while mtries > 1: |
| try: |
| return f(*args, **kwargs) |
| except ExceptionToCheck as e: |
| #traceback.print_exc() |
| half_interval = mdelay * 0.10 #interval size |
| actual_delay = random.uniform(mdelay - half_interval, mdelay + half_interval) |
| msg = "Retrying in %.2f seconds ..." % actual_delay |
| if logger is None: |
| logging.exception(msg) |
| else: |
| logger.exception(msg) |
| time.sleep(actual_delay) |
| mtries -= 1 |
| mdelay *= 2 |
| return f(*args, **kwargs) |
| return f_retry # true decorator |
| return deco_retry |
| |
| |