我正在尝试使用“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()
或 适当的地方,而不是在客户端结构上存储单个上下文。
慕田峪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
}
- 2 回答
- 0 关注
- 139 浏览
添加回答
举报
0/150
提交
取消