猿问

当我使用 `golang.org/x/time` NewLimiter() 时,限制更高的爆发

你使用的是什么版本的 Go ( go version)?

go version

输出:


go 版本 go1.12.17 darwin/amd64


您使用的是什么版本的软件包(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 时,它应该允许()最大调用是突发的。


倚天杖
浏览 160回答 1
1回答

慕婉清6462132

突发不是最大速率。除了重新填充率之外,它是存储桶中令牌的数量。您将速率设置为每秒 100 个令牌,突发容量设置为 10。程序运行一秒钟内可以消耗 100 个令牌,再加上突发容量增加的 10 个令牌,这并不奇怪。如果您希望在一秒钟内发生的事情不超过 10 件,请将速率设置为 10 并将突发设置为零。
随时随地看视频慕课网APP

相关分类

Go
我要回答