仅仅限制并发数

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() 减少计数器

这样就可以控制每秒请求的并发数了。