Ai
1 Star 1 Fork 0

ksc-klog/klog-go-sdk

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
rate_limit.go 1.54 KB
一键复制 编辑 原始数据 按行查看 历史
liuchong1 提交于 2022-05-16 06:13 +08:00 . refact 基于PutLogsM重构
package klog
import "time"
type RateLimit struct {
slotsLen int
slots []int
limitPerSec int
limitPerSlotPerSec float64
previousI int
previousTime int64
}
func NewRateLimit(limitPerSec, slotsPerSec int) *RateLimit {
if limitPerSec < 1 {
limitPerSec = 1
}
if slotsPerSec < 0 {
slotsPerSec = 1
} else if slotsPerSec > 10 {
slotsPerSec = 10
}
return &RateLimit{
slotsLen: slotsPerSec,
slots: make([]int, slotsPerSec, slotsPerSec),
limitPerSec: limitPerSec,
limitPerSlotPerSec: float64(limitPerSec) / float64(slotsPerSec),
previousI: 0,
previousTime: time.Now().UnixMilli(),
}
}
func (o *RateLimit) Wait() {
added := false
for {
// 距离上次调用超过1秒,清零计数器
now := time.Now().UnixMilli()
if now > o.previousTime+1000 {
for i := range o.slots {
o.slots[i] = 0
}
}
// 每隔一段时间切换一次slot
i := int(now * int64(o.slotsLen) / 1000 % int64(o.slotsLen))
if o.previousI != i {
o.slots[i] = 0
o.previousI = i
}
//计数
if !added {
o.slots[i] += 1
added = true
}
// 每秒总数、每slot计数分别不得超限
if sum(o.slots) >= o.limitPerSec || float64(o.slots[i]) > o.limitPerSlotPerSec && o.slots[i] > 0 {
// 如果超限,休眠一个slot的跨度
time.Sleep(time.Millisecond * time.Duration(1000/o.slotsLen))
} else {
break
}
o.previousTime = now
}
}
func sum(slice []int) (total int) {
for i := range slice {
total += slice[i]
}
return total
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/klogsdk/klog-go-sdk.git
git@gitee.com:klogsdk/klog-go-sdk.git
klogsdk
klog-go-sdk
klog-go-sdk
v0.5.1

搜索帮助