使用 sync.WaitGroup
为了等待 goroutine 结束,我们可以使用 sync.WaitGroup
来实现等待
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | package main
  import ( 	"fmt" 	"sync" 	"time" )
  func worker(id int, wg *sync.WaitGroup) { 	fmt.Printf("Worker %d starting\n", id)
  	time.Sleep(time.Second)
  	fmt.Printf("Worker %d done\n", id)
  	wg.Done()   }
  func main()  { 	var wg sync.WaitGroup
  	for i := 1; i <= 5; i++ { 		wg.Add(1)  		go worker(i, &wg) 	}
  	wg.Wait() 
  	fmt.Println("All done!") }
 
   | 
 
使用 channel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   | package main
  import ( 	"fmt" 	"time" )
  func worker(id int, ch chan int) { 	fmt.Printf("Worker %d starting\n", id)
  	time.Sleep(time.Second)
  	ch <- id }
  func main() { 	ch := make(chan int)
  	for i := 1; i <= 5; i++ { 		go worker(i, ch) 	}
  	for i := 1; i <= 5; i++ { 		fmt.Printf("Worker %d done\n", <-ch) 	}
  	fmt.Println("All done!") }
 
   | 
 
chanel 的特性是从 channel 中获取数据的时候会引起阻塞,直到 channel
有数据,所以我们可以利用这个特性在 goroutine 的最后往 channel
里面放东西, 然后主协程里面从 channel
里面获取东西,只需要次数一致就可以了。
这种方式也是官方推荐的同步方式,sync 通常用于比较底层的同步