猿问

在并行 goroutine 中使用速率限制器会导致竞争条件吗?

作为对我的代码的极大简化,我有一个 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()当允许执行继续时,这会导致竞争条件吗?因为我仍然受到第三方的速率限制。


富国沪深
浏览 104回答 1
1回答

MM们

不,它没有。limiter.Wait()是并发安全的,您可以在 Limiter 实现的源文件中看到这一点。您可以在任何并发场景中自由使用 Limiter。
随时随地看视频慕课网APP

相关分类

Go
我要回答