4. 如何控制并发数
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())
}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()
}()
}
}最后更新于