考虑如下场景:一个线程要接收来自于一个chan的全部数据,并对这个数据进行一个耗时的处理,每一个数据用一个单独的线程去做,最后需要等待这些线程结束并输出一些统计信息。
    https://book.itsfun.top/gopl-zh/ch8/ch8-05.html

    1. func generator(out chan<- int) {
    2. for i := 0; i < 10; i++ {
    3. out <- i
    4. }
    5. close(out)
    6. }
    7. // process 一个耗时的操作
    8. func process(x int) int {
    9. return x * x
    10. }
    11. // printer 从in中接收数据,经过一个耗时操作(用协程处理),然后打印结果,并输出总共处理的元素个数
    12. func printer(in <-chan int) {
    13. outs := make(chan int)
    14. wg := sync.WaitGroup{}
    15. for x := range in {
    16. wg.Add(1)
    17. go func(xinput int) {
    18. defer wg.Done()
    19. y := process(xinput)
    20. outs <- y
    21. }(x)
    22. }
    23. go func() {
    24. wg.Wait()
    25. close(outs)
    26. }()
    27. num := 0
    28. for y := range outs {
    29. num++
    30. fmt.Println(y)
    31. }
    32. fmt.Println("total num", num)
    33. }
    34. func main() {
    35. ch := make(chan int)
    36. go generator(ch)
    37. printer(ch)
    38. }