考虑如下场景:一个线程要接收来自于一个chan的全部数据,并对这个数据进行一个耗时的处理,每一个数据用一个单独的线程去做,最后需要等待这些线程结束并输出一些统计信息。
https://book.itsfun.top/gopl-zh/ch8/ch8-05.html
func generator(out chan<- int) {for i := 0; i < 10; i++ {out <- i}close(out)}// process 一个耗时的操作func process(x int) int {return x * x}// printer 从in中接收数据,经过一个耗时操作(用协程处理),然后打印结果,并输出总共处理的元素个数func printer(in <-chan int) {outs := make(chan int)wg := sync.WaitGroup{}for x := range in {wg.Add(1)go func(xinput int) {defer wg.Done()y := process(xinput)outs <- y}(x)}go func() {wg.Wait()close(outs)}()num := 0for y := range outs {num++fmt.Println(y)}fmt.Println("total num", num)}func main() {ch := make(chan int)go generator(ch)printer(ch)}
