如何实现固定超时和尝试次数的指数backoff/delay计算?
How to implement exponential backoff/delay calculation with fixed timeout and number of attempts?
我见过的大多数 backoff/delay 算法都有固定的尝试次数或固定的超时时间,但不是两者都有。
我想在 T 秒内进行恰好 M 次尝试,它们之间的间隔为指数,因此 "T = delay(0) + delay(1) + ... + delay(M-1)",其中 "delay(N) = (e^N - 1) / e"(其中 N - 重试次数)。
如何计算上面描述的"e"值,使得在总超时T内恰好进行M次尝试(提前指定M和T)?
由于"T"是"e"的单调函数,您可以执行二分查找找到最适合的值。
这是一个示例 Python 程序,用于在给定 "T" 和 "M":
的情况下找到这样的 "e"
def total_time(e, M):
current = 1
total = 0
for i in range(M):
total += current-1
current *= e
return total
def find_best_e(T, M):
a, b = 0, T
while abs(a-b) > 1e-6:
m = (a+b)/2.0
if total_time(m, M) > T:
b = m
else:
a = m
return (a+b)/2
e = find_best_e(10, 3)
print([e**n-1 for n in range(3)])
我见过的大多数 backoff/delay 算法都有固定的尝试次数或固定的超时时间,但不是两者都有。
我想在 T 秒内进行恰好 M 次尝试,它们之间的间隔为指数,因此 "T = delay(0) + delay(1) + ... + delay(M-1)",其中 "delay(N) = (e^N - 1) / e"(其中 N - 重试次数)。
如何计算上面描述的"e"值,使得在总超时T内恰好进行M次尝试(提前指定M和T)?
由于"T"是"e"的单调函数,您可以执行二分查找找到最适合的值。
这是一个示例 Python 程序,用于在给定 "T" 和 "M":
的情况下找到这样的 "e"def total_time(e, M):
current = 1
total = 0
for i in range(M):
total += current-1
current *= e
return total
def find_best_e(T, M):
a, b = 0, T
while abs(a-b) > 1e-6:
m = (a+b)/2.0
if total_time(m, M) > T:
b = m
else:
a = m
return (a+b)/2
e = find_best_e(10, 3)
print([e**n-1 for n in range(3)])