刚刚开始了解 goroutine 的强大功能。
我有大约 100 个帐户和大约 10 个区域,循环它们以使用 golang 创建大约 1000 个 goroutine 以提高读取速度。它运行速度太快,以至于达到了 20/秒的 API 返回限制。
如何保证所有goroutine都能维持最大调用速率(20/s)?我不确定哪种 golang 并发方法最适合处理错误。
eg:
func readInstance(acc string, region string, wg *sync.WaitGroup) {
defer wg.Done()
response, err := client.DescribeInstances(acc, region)
if err != nil {
log.Println(err) // API limit exceeding 20
return
}
.
.
.
.
}
func main() {
accounts := []string{"g", "h", "i", ...}
regions := []string{"g", "h", "i", ...}
for _, region := range regions {
for i := 0; i < len(accounts); i++ {
wg.Add(1)
go readInstance(accounts[i], region, &wg)
}
}
wg.Wait()
}
如果您对在特定的实时时间内可以执行的请求数量有固定的上限,则可以使用time.NewTicker() https://pkg.go.dev/time#NewTicker将事物隔开。
c := time.NewTicker(50 * time.Millisecond)
defer c.Stop()
现在,当您想发出服务器请求时,只需插入
<- c.C
在实际请求之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)