我正在尝试访问具有线程限制的 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
您可以将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)
| 归档时间: |
|
| 查看次数: |
2319 次 |
| 最近记录: |