我正在尝试访问具有线程限制的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
这可以工作,但是没有给出任何消息表明它正在工作。
是否有一个参数/方式可用来记录进行重试的次数,例如waiting for 10 sec before next attempt
答案 0 :(得分:1)
您可以将wait_func
的{{1}}参数与将尝试次数和延迟毫秒数作为参数并根据需要输出消息的函数一起使用:
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()
答案 1 :(得分:1)
这是另一种解决方法
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