mirror of https://github.com/Syncplay/syncplay
Refactoring
This commit is contained in:
parent
efec7f030b
commit
d7c43f2e54
|
@ -0,0 +1,42 @@
|
||||||
|
import time
|
||||||
|
|
||||||
|
def retry(ExceptionToCheck, tries=4, delay=3, backoff=2, logger=None):
|
||||||
|
"""Retry calling the decorated function using an exponential backoff.
|
||||||
|
|
||||||
|
http://www.saltycrane.com/blog/2009/11/trying-out-retry-decorator-python/
|
||||||
|
original from: http://wiki.python.org/moin/PythonDecoratorLibrary#Retry
|
||||||
|
|
||||||
|
:param ExceptionToCheck: the exception to check. may be a tuple of
|
||||||
|
excpetions to check
|
||||||
|
:type ExceptionToCheck: Exception or tuple
|
||||||
|
:param tries: number of times to try (not retry) before giving up
|
||||||
|
:type tries: int
|
||||||
|
:param delay: initial delay between retries in seconds
|
||||||
|
:type delay: int
|
||||||
|
:param backoff: backoff multiplier e.g. value of 2 will double the delay
|
||||||
|
each retry
|
||||||
|
:type backoff: int
|
||||||
|
:param logger: logger to use. If None, print
|
||||||
|
:type logger: logging.Logger instance
|
||||||
|
"""
|
||||||
|
def deco_retry(f):
|
||||||
|
def f_retry(*args, **kwargs):
|
||||||
|
mtries, mdelay = tries, delay
|
||||||
|
try_one_last_time = True
|
||||||
|
while mtries > 1:
|
||||||
|
try:
|
||||||
|
return f(*args, **kwargs)
|
||||||
|
try_one_last_time = False
|
||||||
|
break
|
||||||
|
except ExceptionToCheck, e:
|
||||||
|
if logger:
|
||||||
|
msg = "%s, Retrying in %d seconds..." % (str(e), mdelay)
|
||||||
|
logger.warning(msg)
|
||||||
|
time.sleep(mdelay)
|
||||||
|
mtries -= 1
|
||||||
|
mdelay *= backoff
|
||||||
|
if try_one_last_time:
|
||||||
|
return f(*args, **kwargs)
|
||||||
|
return
|
||||||
|
return f_retry # true decorator
|
||||||
|
return deco_retry
|
Loading…
Reference in New Issue