在Python中使用随机退避延迟重试失败的http请求?

时间:2017-10-15 21:33:54

标签: python-requests urllib3

Can I set max_retries for requests.request?所述,可以通过urllib3和请求模块灵活支持在Python中重试失败的http请求。默认选项允许指数退避方法。

但是我有很多客户端与我的服务器并行运行,我希望客户端通过以不同的速率退回来管理负载,随机。早期的retry_callable参数用于在制作Retry对象时提供任意回调函数,如A look at the new retry behavior in urllib3 | Kevin Burke所述,并未进入最终代码。有没有其他方法可以实现我正在寻找的东西,而不是通过他帮助我们避免的try-except块来实现重试自己的复杂性?

1 个答案:

答案 0 :(得分:0)

在查看重试代码后,我认为可能的解决方法可能是使用具有覆盖乘法运算符的类:

class FuncBackoff:
    def __init__(self, func):
        self.func = func

    def __mul__(self, other):
        return self.func() * other

    def __rmul__(self, other):
        return self.__mul__(other)

并以某种方式使用它,就像 Retry(..., backoff_factor=FuncBackoff(lambda: random.uniform(1, 5)), ...)

显然,如果未来退避时间的计算方式发生变化,这可能会被破坏。