2. 如何使用多协程线程安全并发收集结果

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

不墨迹直接放出代码

func job(index int) int {
	time.Sleep(time.Millisecond * 500)
	return index
}

func main() {
	num := 5
	resCh := make(chan int)
	wg := sync.WaitGroup{}
	for i := 0; i < num; i++ {
		wg.Add(1)
		go func(param int) {
			defer wg.Done()
			resCh <- job(param)
		}(i)
	}
	go func() {
		defer close(resCh)
		wg.Wait()
	}()
	for item := range resCh {
		fmt.Println("收到结果: ", item)
	}
}

可以看出其中关键点在于使用channel保证线程安全,waitgroup控制并发阻塞等待,核心在于waitgroup wait函数和close channel应该另开一个goroutine里执行否则for range channel永无执行机会

最后更新于

这有帮助吗?