逐步减慢轮询请求的算法

时间:2014-02-15 07:01:51

标签: algorithm polling

我要求进行轮询,随着时间的推移逐渐变慢。是否存在在这种情况下常用的数学公式?

例如,我可能想在第一次尝试后10秒钟进行轮询,然后逐渐减慢到每1-5分钟一次。

1 个答案:

答案 0 :(得分:0)

我认为几何系列是常见的选择。这就是10 * 1.2**N的样子:

irb(main):009:0> (0..20).map{|i| 10 * 1.2**i }
=> [10.0, 12.0, 14.399999999999999, 17.279999999999998, 20.735999999999997, 24.883199999999995,
29.85983999999999, 35.831807999999995, 42.99816959999998, 51.597803519999985, 61.917364223999975,
74.30083706879996, 89.16100448255996, 106.99320537907195, 128.39184645488632, 154.0702157458636,
184.8842588950363, 221.86111067404354, 266.23333280885225, 319.4799993706227, 383.3759992447472]

您可能还想检查累计时间,直到宣布“超时”。

irb(main):010:0> (0..20).map{|i| 10 * 1.2**i }.inject(:+)
=> 2250.255995468484

仅供参考,Linux TCP SYN重试使用更积极的减速因子3 * 2**N

irb(main):011:0> (0..5).map{|i| 3 * 2**i }
=> [3, 6, 12, 24, 48, 96]
irb(main):012:0> (0..5).map{|i| 3 * 2**i }.inject(:+)
=> 189