问等待所有goroutine结束,怎么做?

题目来源:滴滴

答案:

1)用channel进行同步(该方法需要知道goroutine的数量)

  1. func main() {
  2. ch := make(chan int, 2)
  3. go func() {
  4. for i := 0; i < 10; i++ {
  5. time.Sleep(1 * time.Second)
  6. fmt.Println("go routine1", i)
  7. }
  8. ch <- 1
  9. }()
  10. go func() {
  11. for i := 0; i < 10; i++ {
  12. time.Sleep(1 * time.Second)
  13. fmt.Println("go routine2", i)
  14. }
  15. ch <- 2
  16. }()
  17. // 等待
  18. for i := 0; i < 2; i++ {
  19. <-ch
  20. }
  21. fmt.Println("main exist")
  22. }

2)用sync.WaitGroup

  1. package main
  2. import "fmt"
  3. import "time"
  4. import "sync"
  5. func main() {
  6. var wg sync.WaitGroup
  7. for i := 0; i < 10; i++ {
  8. wg.Add(1)
  9. go func(i int) {
  10. defer wg.Done()
  11. time.Sleep(1 * time.Second)
  12. fmt.Println(i)
  13. }(i)
  14. }
  15. wg.Wait() // 等待
  16. fmt.Println("main exist")
  17. }