import logging
import wrapt
import sys
import time
def retry(
retries=3, exceptions=Exception,
delay=1, max_delay=60, backoff=2,
logger=None, log_level=logging.ERROR,log_extra=None
):
@wrapt.decorator
def _wrapper(wrapped, instance, args, kwargs):
_delay = delay
_retries = sys.maxsize if retries == -1 else retries
for tries in range(_retries+1):
try:
return wrapped(*args, **kwargs)
except Exception as exc:
if isinstance(exc, KeyboardInterrupt):
raise
if logger:
logger.log(log_level, str(exc), exc_info=True, extra=log_extra)
if tries >= _retries:
raise
time.sleep(_delay)
_delay = min(_delay * backoff, max_delay)
return _wrapper
关于@wrapt.decorator的用法可参考:https://blog.csdn.net/dianyin7770/article/details/101936029/



