一组协程完成后需要通知其他协程,可以怎么办?

题目来源:字节跳动

答案:

本题有两种方法:
1、使用全局的 sync.waitGroup 来控制协程执行个数,如下图代码所示

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var wg sync.WaitGroup
  8. func w() {
  9. defer wg.Done()
  10. for i := 10; i < 20; i++ {
  11. fmt.Printf("%v ", i)
  12. time.Sleep(1 * time.Second)
  13. }
  14. }
  15. func main() {
  16. wg.Add(3)
  17. for i := 0; i < 3; i++ {
  18. go w()
  19. }
  20. wg.Wait()
  21. fmt.Printf("
  22. ")
  23. for i := 11; i <= 15; i++ {
  24. fmt.Printf("%v ", i)
  25. time.Sleep(1 * time.Second)
  26. }
  27. }

2、也可以使用 channel 进行通信,如果一组协程都执行完毕,则向 channel 中发送数据,激活等待中的协程。