Есть ли способ записать количество повторных попыток? - PullRequest
2 голосов
/ 21 марта 2019

Я пытаюсь запустить веб-сервис с ограничением потока, т. Е. Если в течение нескольких секунд будет выполнено слишком много запросов, будет выдано исключение, если предполагается, что это атака.

Для решения этой проблемы мы используем модуль повторных попыток из python.

Вот пример кода

from retrying import retry


@retry(stop_max_attempt_number=10,wait_exponential_multiplier=1000, wait_exponential_max=10000)
def f():
    # Call web service 

Это работает, однако нет сообщений, указывающих, что он работает.

Есть ли параметр / способ, которым мы могли бы использовать для регистрации количества выполненных попыток, что-то вроде waiting for 10 sec before next attempt

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вот еще один подход к решению проблемы

after_attempts в качестве другого флага, который можно использовать

def _after(attempt_number):
    print(attempt_number)


@retry(wait_fixed=100, stop_max_attempt_number=3, after_attempts=_after)
def _test_after():
    raise Exception("testing after_attempts handler")

Но он все еще находится в стадии разработки и может быть получен с помощью повторной попытки master код нечасть последнего релиза: 1.3.3

1 голос
/ 21 марта 2019

Вы можете использовать параметр 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
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...