4. 如何控制并发数
此开源图书由ithaiq原创,创作不易转载请注明出处
控制同时执行的协程数
func main() {
var wg sync.WaitGroup
ch := make(chan struct{}, 6)
for i := 0; i < 10; i++ {
ch <- struct{}{}
wg.Add(1)
go func(i int) {
defer wg.Done()
log.Println(i, ":", runtime.NumGoroutine())
<-ch
}(i)
}
wg.Wait()
log.Println(runtime.NumGoroutine())
}
2. 控制协程一批批执行
func work() {
fmt.Println("执行:", rand.Intn(10))
}
func setPool(pool chan<- struct{}) {
for i := 0; i < 5; i++ {
pool <- struct{}{}
}
}
func main() {
var pool = make(chan struct{}, 5)
var wg sync.WaitGroup
setPool(pool)
wg.Add(5)
go func() {
for {
wg.Wait()
time.Sleep(time.Second * 2)
setPool(pool)
wg.Add(5)
}
}()
for {
<-pool
go func() {
defer wg.Done()
work()
}()
}
}
最后更新于
这有帮助吗?