Вы можете использовать параметр wait_func
для retry
с функцией, которая принимает количество попыток и количество миллисекунд задержки в качестве параметров и печатает сообщение по желанию:
from retrying import retry
import time
def wait(attempts, delay):
print('Attempt #%d, retrying in %d seconds' % (attempts, delay // 1000))
return delay
@retry(wait_func=wait)
def f():
time.sleep(1)
raise RuntimeError
f()
Это выводит:
Attempt #1, retrying in 1 seconds
Attempt #2, retrying in 3 seconds
Attempt #3, retrying in 7 seconds
Attempt #4, retrying in 15 seconds
...
Если вы хотите использовать опцию экспоненциального сна, вам придется создать свой собственный экземпляр Retrying
и использовать собственный декоратор, чтобы использовать его, чтобы вашПользовательская функция wait
может вызывать метод exponential_sleep
с вашим экземпляром Retrying
:
from retrying import Retrying
def wait(attempts, delay):
print('Attempt #%d, retrying in %d seconds' % (attempts, delay // 1000))
return retrying.exponential_sleep(attempts, delay)
retrying = Retrying(wait_func=wait, stop_max_attempt_number=10, wait_exponential_multiplier=1000, wait_exponential_max=10000)
custom_retry = lambda f: lambda *args, **kwargs: retrying.call(f, *args, **kwargs)
@custom_retry
def f():
raise RuntimeError
f()
Это выводит:
Attempt #1, retrying in 0 seconds
Attempt #2, retrying in 2 seconds
Attempt #3, retrying in 6 seconds
Attempt #4, retrying in 14 seconds
Attempt #5, retrying in 24 seconds
Attempt #6, retrying in 34 seconds
...