作為對我的代碼的重大簡化,我有一個 goroutine 可以并行運行數千次,每個 goroutine 都在等待通過速率限制器從以下位置運行golang.org/x/time/rate
:
func main() {
limiter := rate.NewLimiter(rate.Every(time.Second/100), 1) // 100 RPS
for _ := range jobs {
go run(&limiter)
}
}
func run(limiter *rate.Limiter) {
limiter.Wait()
// do stuff...
}
我們的想法是run()
盡可能頻繁地執行,但僅限于 100 次呼叫/秒,以符合第三方 API 的 100 RPS 速率限制。
limiter.Wait()
當允許執行繼續時,這會導致競爭條件嗎?因為我仍然受到第三方的速率限制。
uj5u.com熱心網友回復:
不,它沒有。
limiter.Wait()
是并發安全的,您可以在 Limiter 實作的源檔案中看到這一點。
您可以在任何并發場景中自由使用 Limiter。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/508497.html