【trick】A variant of token bucket implementation

 1 struct TokenBucket
 2 {
 3   double fill_interval_;
 4   double gen_interval_;
 5   double reset_time_;
 6   // reset_time_ is equivalent to last_consume_time + token_num and
 7   // the calculated token num is auto renormalized on limit change.
 8   
 9   TokenBucket()
10   : fill_interval_(0.0)
11   , gen_interval_(0.0)
12   , reset_time_(0.0) {}
13   
14   // eg, for 10req/30s, capacity=10, period=30
15   void set_limit(double capacity, double period)
16   {
17     fill_interval_ = period;
18     gen_interval_ = period / capacity;
19   }
20   
21   bool consume(unsigned num)
22   {
23     double curr_time = get_monotonic_time();
24     double new_reset_time = std::max(reset_time_, curr_time - fill_interval_) + gen_interval_ * num;
25     if (curr_time >= new_reset_time)
26     {
27       reset_time_ = new_reset_time; // reset_time_ is monotonic increasing
28       return true;
29     }
30     return false;
31   }
32 };

猜你喜欢

转载自www.cnblogs.com/albumcover/p/9780439.html
今日推荐