这个问题是因为golang运行时最大进行中线程数限制在10000个。

可以用创建线程池的方式限制同时运行的线程数量。

比如,带有缓冲的channel。

func doThing(d interface{}){
    // 一些业务逻辑
}
func main() {
    var data [1000]int // 假设有1000   
    poolSize := runtime.NumCPU() // 获取cpu核sem := make(chan struct{}, poolSize)
    for _, d := range data {
        sem <- struct{}{}
        go func(d int){
            doThing(d)
            <-sem
        }(d)
    }
}

以上示例中,sem<- struct{}{}操作,在sem通道满的时候会暂停等待空出,因此保证里go func(d int)同时只有poolSize个。

import (
    "context"
    "golang.org/x/sync/semaphore"
)

func doThing(d interface{}){
    // 一些操作
}

func main() {
    data := [1000]int // 假设有1000个poolSize := runtime.NumCPU() // 获取cpu数核量sem := semaphore.NewWeighted(poolSize)
    for _, d := range data {
        sem.Acquire(context.Background(), 1) // 获取1个锁go func(d interface{}){
            doThing(d)
            sem.Release(1) // 释放1个锁
        }(d)
    }
}

以上示例基本思路与上一个channel缓冲示例一样,通过获取池子中的锁来控制并发数量。