nameko.utils.retry 源代码

import functools
import itertools
from time import sleep

import wrapt


[文档] class RetryDelay(object): def __init__(self, delay, backoff, max_delay):
[文档] self.delay = delay
[文档] self.backoff = backoff
[文档] self.max_delay = max_delay
[文档] def next(self): if self.backoff: self.delay *= self.backoff if self.max_delay: return min(self.delay, self.max_delay) return self.delay
[文档] def retry( wrapped=None, for_exceptions=Exception, max_attempts=3, delay=1, backoff=1, max_delay=None ): if wrapped is None: return functools.partial( retry, for_exceptions=for_exceptions, max_attempts=max_attempts, delay=delay, backoff=backoff, max_delay=max_delay ) if max_attempts is None: max_attempts = float('inf') retry_delay = RetryDelay(delay, backoff, max_delay) @wrapt.decorator def wrapper(wrapped, instance, args, kwargs): counter = itertools.count() while True: try: return wrapped(*args, **kwargs) except for_exceptions: if next(counter) == max_attempts: raise sleep(retry_delay.next()) return wrapper(wrapped) # pylint: disable=E1120