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永无执行机会
最后更新于
这有帮助吗?