为了账号安全,请及时绑定邮箱和手机立即绑定

使用“golang.org/x/time/rate”的速率限制函数 40/秒

使用“golang.org/x/time/rate”的速率限制函数 40/秒

Go
12345678_0001 2023-06-12 15:17:02
我正在尝试使用“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()我不想使用自动收报机,因为我希望速率限制器考虑调用代码运行的时间长度。
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

可以看到 to 的第一个参数NewLimiter是 type rate.Limit

如果您想要 40 个请求/秒,那么这将转化为每 25 毫秒 1 个请求的速率。

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

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

边注:

  • 在生成中,上下文ctx不应存储在结构中,而应按请求存储。看起来会Client被重用,因此您可以将上下文传递给RateLimitFunc()或 适当的地方,而不是在客户端结构上存储单个上下文。


查看完整回答
反对 回复 2023-06-12
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

func RateLimit(ctx context.Context) {

    limiter := rate.NewLimiter(40, 10)

    err := limiter.Wait(ctx)

    if err != nil {

        // Log the error and return

    }

    // Do the actual work here

}

查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信