2 回答
TA贡献1789条经验 获得超10个赞
您没有非常具体地说明超时和重试次数,或者成功的条件...但是,为简单起见,假设您希望重试最多 5 次,重试间隔为 1,并且您希望继续执行 500(或 5xx)以外的错误代码。
然后你可以使用类似的东西:
import time
def sequence_of_requests(arg1, arg2):
yield request_a(arg1)
yield request_b(arg1, arg2)
for retries in range(5):
result = request_c(arg1, arg2)
if result.status_code < 500:
break
time.sleep(1)
yield result
如果达到最大重试次数,则只需返回上次收到的响应。如果获得有效的响应,则脱离循环并返回良好的响应。
有一个小的低效率,因为如果你达到重试总数,你仍然会睡1秒,然后再返回值。您可以通过显式管理变量并检查循环中的限制来解决此问题。但是,对于如何管理放弃,您可能还有其他想法(例如,超时,而不是固定次数的重试),因此您应该调整该部分代码以遵循对您有意义的逻辑。retries
TA贡献1802条经验 获得超6个赞
您可以生成函数,而不是生成响应值本身,然后可以重复调用这些函数。函数的参数可以使用 应用。functools.partial
from functools import partial
def sequence_of_requests(arg1, arg2):
yield partial(request_a, arg1)
yield partial(request_b, arg1, arg2)
yield partial(request_c, arg1, arg2)
现在可以测试这些步骤:
generator_functions = sequence_of_requests()
r = next(generator_functions)()
assert r.status_code == 200
r = next(generator_functions)()
assert r.status_code == 204
# Repeatedly make the request until the expected status code is returned.
func_slow_request = next(generator_functions)
wait_for_status(404)(func_slow_request)
添加回答
举报