go - 当我使用`golang.org/x/time` NewLimiter()时,限制更高的突发,Allow()将返回真正更高的突发

标签 go time

您正在使用哪个版本的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/

相关文章:

api - 无法获得 golang 中最重要的 channel 列表

MySQL 时间数学

string - 将工作日字符串解析为 time.Weekday

Java:将毫秒转换为 HH:MM:SS

python - web2py中输入时间

安装 go 工具的 go 模块

go - 连接器 : Error connecting to a physical device

go - Go 中是否有等效的 java.io.Reader ?

go - 如何获取 Kubernetes 上 pod 的真实和实际存储使用情况?

mysql - 数据库超时 1 小时