有没有办法记录重试次数

Vik*_*war 7 python module

我正在尝试访问具有线程限制的 Web 服务,即如果在几秒钟内发出太多请求,它会抛出异常,假设这是一次攻击。

为了解决同样的问题,我们正在使用 python 中的重试模块

这是示例代码

from retrying import retry


@retry(stop_max_attempt_number=10,wait_exponential_multiplier=1000, wait_exponential_max=10000)
def f():
    # Call web service 
Run Code Online (Sandbox Code Playgroud)

这有效,但是没有给出表明它正在工作的消息。

是否有我们可以用来记录重试次数的参数/方式,例如 waiting for 10 sec before next attempt

blh*_*ing 4

您可以将wait_func参数 forretry与一个函数一起使用,该函数将尝试次数和延迟毫秒数作为参数,并根据需要打印消息:

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()
Run Code Online (Sandbox Code Playgroud)

这输出:

Attempt #1, retrying in 1 seconds
Attempt #2, retrying in 3 seconds
Attempt #3, retrying in 7 seconds
Attempt #4, retrying in 15 seconds
...
Run Code Online (Sandbox Code Playgroud)

但是,如果您想使用指数睡眠选项,则必须实例化自己的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()
Run Code Online (Sandbox Code Playgroud)

这输出:

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
...
Run Code Online (Sandbox Code Playgroud)