这个问题是因为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缓冲示例一样,通过获取池子中的锁来控制并发数量。