Home > Net >  Does using a rate limiter within parallel goroutines cause race conditions?
Does using a rate limiter within parallel goroutines cause race conditions?

Time:09-07

As a heavy simplification of my code, I have a goroutine that gets ran thousands of times in parallel, with each one waiting to run via a rate limiter from 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...
}

The idea is to have run() execute as often as possible, but limited to exactly 100 calls / sec in order to comply with a third-party API's rate limit of 100 RPS.

Would this cause a race condition when limiter.Wait() allows the execution to proceed? Because I'm still being rate limited by the third party.

CodePudding user response:

No, it doesn't.

limiter.Wait() is concurrent safe, you can see this in source files of Limiter's implementation.

You are free to use Limiter in any concurrent scenario.

  • Related