我正在使用golang.org/x/time/rate進行速率限制的api請求。
lim := rate.NewLimiter(rateLimit, burstLimit)
for range time.NewTicker(time.Second).C {
fmt.Println(time.Now(), "tick"/span>)
go func() {
res := lim.Reserve()
if res.OK() && res.Delay() == 0 {
fmt.Println(time.Now(), " done")
} else {
fmt.Println(time.Now(), "drop")
res.Cancel()
}
}()
}
對于可以立即執行的允許請求,有時可能需要重試請求。這些重試的請求不應計入速率限制。在這種情況下使用res.Cancel()不會將保留的令牌回傳到池中,因為https://cs.opensource.google/go/x/time/ /1f47c861:rate/rate.go;l=161
保留的代幣如何解除保留或調整限制器的狀態?
uj5u.com熱心網友回復:
你想要rate.Reservation.Cancel()--考慮到限速器的同時使用情況,它在 "撤銷 "預訂方面做了最大的努力。
來自檔案:
Cancel 是 CancelAt(time.Now()) 的簡寫。
CancelAt 表示保留的持有人將不執行 保留的操作,并且盡可能地扭轉此保留對速率限制的影響。 盡可能地扭轉此預訂對速率限制的影響,考慮到其他預訂 可能已經作出。
uj5u.com熱心網友回復:
這感覺很糟糕,但似乎我們可以使用ReserveN或AllowN的負值來回傳代幣池。https://play.golang.org/p/yt0RS3MJOpi
lim := rate.NewLimiter(rate.Every(3*time.Second), 1)
for range time.NewTicker(time.Second).C {
fmt.Println(time.Now(), "tick --"/span>)
go func() {
if lim.Allow() {
fmt.Println(time.Now(), "allow" )
time.Sleep(time.Duration(rand.Intn(20) ) * time.Millisecond)
if rand.Intn(2) == 0 {
lim.AllowN(time.Now(), -1)
fmt.Println(time.Now(), "revert")
}
} else {
fmt.Println(time.Now(), "drop")
}
}()
}
這個例子表明--只要允許的操作被撤銷,下一個操作也是允許的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329369.html
標籤:
上一篇:用條件查詢多對多
