https://pkg.go.dev/github.com/beefsack/go-rate#section-sourcefiles
用法
-
new()
:创建一个实例 -
wait()
:用来阻塞等待 -
try()
:返回两个值,一个是表示是否可以立刻执行,另一个是需要延迟多久执行
实现
它的实现是,任何一段时间interval内,不能有超过limit个请求
维护一个队列,队列头是最早的时间,队列元素不会删(相当于固定的token数),到了limit后就从头部移动到尾部
假如当前队列中数目不超过limit个(最一开始的情况)
后面的情况就是:每次对比下队列中最早的时间和当前时间,最早时间超过了当前时间说明已经被处理过了相当于有空闲token了,所以可以处理(设置时间,移动到队列尾),不用sleep;否则就sleep这个差值。
其他
它的处理不是时间片均匀的, 比如说设置1s有100个token,有100个线程来抢,cpu处理很快的话,可能0.1秒就处理完了剩下0.9秒都是闲的,这样的话CPU峰值会高但其他时间可能很闲。即CPU的工作不是很均匀。
网友评论