zahodi.ansible-mikrotik/pythonlibs/mt_api/retryloop.py

39 lines
919 B
Python
Raw Permalink Normal View History

2017-05-25 15:02:18 -07:00
# retry loop from http://code.activestate.com/recipes/578163-retry-loop/
import time
import sys
class RetryError(Exception):
pass
def retryloop(attempts, timeout=None, delay=0, backoff=1):
starttime = time.time()
success = set()
for i in range(attempts):
success.add(True)
yield success.clear
if success:
return
duration = time.time() - starttime
if timeout is not None and duration > timeout:
break
if delay:
time.sleep(delay)
delay *= backoff
e = sys.exc_info()[1]
# No pending exception? Make one
if e is None:
try:
raise RetryError
except RetryError as exc:
e = exc
# Decorate exception with retry information:
e.args = e.args + ("on attempt {0} of {1} after {2:.3f} seconds".format(
i + 1, attempts, duration), )
raise e