限速功能40 /秒,带有“ golang.org/x/time/rate”

时间:2019-02-27 07:25:24

标签: go

我正在尝试使用“ golang.org/x/time/rate”来构建一个功能,该功能在令牌释放之前一直阻塞。这是使用库将代码块的速率限制为每秒40个请求,存储桶大小为2的正确方法吗?

type Client struct {
    limiter        *rate.Limiter
    ctx context.Context
}

func NewClient() *Client {
    c :=Client{}
    c.limiter = rate.NewLimiter(40, 2)
    c.ctx = context.Background()
    return &c
}

func (client *Client) RateLimitFunc() {

    err := client.limiter.Wait(client.ctx)
    if err != nil {
        fmt.Printf("rate limit error: %v", err)
    }
}

为了限制我调用的代码块的速度

RateLimitFunc()

我不想使用代码,因为我希望速率限制器考虑调用代码运行的时间长度。

1 个答案:

答案 0 :(得分:1)

在此处阅读文档; link

您可以看到NewLimiter的第一个参数的类型为rate.Limit

如果您希望每秒请求40个请求,则表示每25ms发出1个请求。

您可以执行以下操作来创建它:

limiter := rate.NewLimiter(rate.Every(25 * time.Millisecond), 2)

旁注:

  • 在生成上下文时,ctx不应存储在结构上,而应按请求进行。看来Client将被重用,因此您可以将上下文传递到RateLimitFunc()或任何适当的位置,而不是在客户端结构上存储单个上下文。
相关问题