作为代码的一项重大简化,我有一个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()允许执行时,这会导致竞争条件吗?因为我仍然受到第三方的限制。
发布于 2022-09-06 11:46:08
不,不是的。
limiter.Wait()是并发安全的,您可以在限制器实现的源文件中看到这一点。
您可以在任何并发场景中自由使用限制器。
https://stackoverflow.com/questions/73594626
复制相似问题