Skip to content

Instantly share code, notes, and snippets.

@Weizhang2017
Created November 8, 2019 09:55
Show Gist options
  • Save Weizhang2017/4b3bded76ba94f012f55a4664fe0e39a to your computer and use it in GitHub Desktop.
Save Weizhang2017/4b3bded76ba94f012f55a4664fe0e39a to your computer and use it in GitHub Desktop.
a decorator to retry upon Exception
import time
from functools import wraps
import logging
logger = logging.getLogger(__name__)
def retry(retries=3, delay=10, backoff=10, logger=None):
"""Retry calling the decorated function using an exponential backoff.
: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):
@wraps(f)
def f_retry(*args, **kwargs):
mtries, mdelay = retries, delay
while mtries > 1:
try:
return f(*args, **kwargs)
except Exception as e:
msg = "%s, Retrying in %d seconds..." % (str(e), mdelay)
logger.warning(msg)
time.sleep(mdelay)
mtries -= 1
mdelay *= backoff
return f(*args, **kwargs)
return f_retry # true decorator
return deco_retry
@retry(logger=logger)
def p(a):
print(a)
if __name__ == '__main__':
p('asd','asd')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment