有没有办法记录疯狂的重试次数

2024-09-28 01:23:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图攻击有线程限制的web服务,也就是说,如果在几秒钟内发出太多的请求,它将抛出异常,假设这是一个攻击。在

为了解决这个问题,我们使用python的retrying模块

下面是示例代码

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


Tags: 模块代码fromimportweb示例线程max
2条回答

这里有另一种解决方法

作为另一个可以使用的标志

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")

但这仍在开发中,可以使用retrying master代码获取,而不是最新版本1.3.3的一部分

您可以将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()

该输出:

^{pr2}$

但是,如果您想使用指数睡眠选项,则必须实例化您自己的Retrying实例并使用自定义装饰器来使用它,以便您的自定义wait函数可以使用您的Retrying实例调用exponential_sleep方法:

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
...

相关问题 更多 >

    热门问题