您正在使用哪个版本的Go(go version
)?
$ go version go version go1.12.17 darwin/amd64
What version of package are you using (rate version
)?
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4
你做了什么?在amd64上运行以下命令:
package main
import (
"fmt"
"golang.org/x/time/rate"
"sync"
"sync/atomic"
"time"
)
func main() {
now := time.Now()
t := time.After(time.Second)
limit := rate.Limit(100)
burst := 10
l := rate.NewLimiter(limit, burst)
var count int
for {
select {
case <-t:
fmt.Printf("%ds, %d\n", time.Now().Sub(now).Nanoseconds()/1e9, count)
return
default:
if l.Allow() {
count++
}
}
}
}
您期望看到什么?1s, 10
您看到了什么?1s, 110
我对count
不等于突发大小感到困惑。当我将Limit = 100设置为burst = 10时,应将Allow()用于最大调用数设为burst。
最佳答案
突发不是最大速率,它是存储桶中除重新填充速率外的 token 数量。
您将速率设置为每秒100个 token ,并将突发容量设置为10。
毫不奇怪,您可以在程序运行的一秒钟内消耗100个 token ,再加上突发容量增加的10个 token 。
如果您希望在一秒钟内发生的事件不超过10个,请将速率设置为10,然后将其设置为零。
关于go - 当我使用`golang.org/x/time` NewLimiter()时,限制更高的突发,Allow()将返回真正更高的突发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62674202/