golang 速率限制
在一些情况下需要限制某些方法的执行速率,常见是控制并发。如下是使用"golang.org/x/time/rate"控制速率的代码。
后续看了一下实现,是在调用获取令牌的方法时,通过上次获取令牌的时间到当前时间的之间相差的时间 乘以 令牌速率,判断是否有足够多的令牌返回。来做速率限制。
func main() {
// 使用every指定的方式,就是设定每隔多少时间产生一个令牌,如下就是每200毫米秒产生一个令牌
ev := rate.Every(200 * time.Millisecond)
limit := rate.NewLimiter(ev, 3)
// 如果直接传值整形,就是指定每秒产生多少令牌,如下就是每秒产生2个令牌
// limit := rate.NewLimiter(2, 3)
// 设置好延迟时间,到时间后自动退出,如果不设置则一直执行产生令牌
// ctx, cancel := context.WithTimeout(context.Background(), time.Second*4)
// defer cancel() // 超时取消
ctx := context.Background()
go func() {
for i := 0; ; i++ {
// wait 会阻塞等待,但如果只用 limit.Allow() 就不会阻塞
err := limit.Wait(ctx)
fmt.Println("a", i, time.Now().Format("2006-01-02 15:04:05.000"))
if err != nil { // 超时取消 err != nil
fmt.Println("err: ", err.Error())
return // 超时取消,退出 for
}
}
}()
go func() {
for i := 0; ; i++ {
err := limit.Wait(ctx)
fmt.Printf("b %03d %s\n", i, time.Now().Format("2006-01-02 15:04:05.000"))
if err != nil { // 超时取消 err != nil
fmt.Println("err: ", err.Error())
return // 超时取消,退出 for
}
}
}()
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具