2014-02-15 52 views
3

我有一個要求,隨着時間的推移逐漸變慢的輪詢。在這種情況下是否有常用的數學公式?逐漸減慢輪詢請求的算法

例如,我可能想要在第一次嘗試後輪詢10秒鐘,然後逐漸減慢到每隔1-5分鐘。

+0

這將是很好定義一個 「增長放緩的因素」。說它的價值是「0.8」,那麼你會在10,8,6.4等民意調查。或者你可以使用一個常數減法和民意調查在10,9,8等這真的取決於你想做什麼。請注意浮點運算。 –

回答

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