4. 如何控制并发数

此开源图书由ithaiq原创,创作不易转载请注明出处

  1. 控制同时执行的协程数

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()
		}()
	}
}

最后更新于

这有帮助吗?