Go如何控制并发请求数
仅仅限制并发数
var limit = make(chan int, 300)
func main() {
// …………
for _, w := range work {
go func() {
limit <- 1
w()
<-limit
}()
}
// …………
}
控制单位时间内并发数
可以通过使用 time.Tick 和 sync.WaitGroup 来控制每秒请求并发数。
具体实现方法如下:
const maxQPS = 100 // 每秒最大请求数
func main() {
qpsInterval := time.Second / time.Duration(maxQPS) // 每个请求的时间间隔
var wg sync.WaitGroup
ticker := time.Tick(qpsInterval)
for i := 0; i < 1000; i++ {
wg.Add(1)
<-ticker // 等待下一个请求时间间隔
go func() {
// 发送请求的代码
wg.Done()
}()
}
wg.Wait()
}
上面代码中定义了每秒最大请求数 maxQPS ,通过计算每个请求的时间间隔 qpsInterval ,使用 time.Tick 创建一个定时器 ticker ,每次等待定时器的时间间隔,控制每秒的请求数。
在循环中,我们使用 sync.WaitGroup 来等待所有请求完成。每次循环,我们使用 wg.Add(1) 增加计数器,表示有一个请求正在进行,然后等待 ticker 的时间间隔,发送请求,最后使用 wg.Done() 减少计数器
这样就可以控制每秒请求的并发数了。