golang中有2种方式同步程序,一种使用channel,另一种就是sync.WaitGroup,今天我们介绍比较简单的sync.WaitGroup。

sync.WaitGroup只有3个方法,Add(),Done(),Wait()。其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。
要注意的有一点。sync文档已经说明了的,在运行main函数的goroutine里运行Add()函数,在其他的goroutine里面运行Done()函数。

代码示例如下:

  1. package main
  2. import (
  3. "runtime"
  4. "time"
  5. "fmt"
  6. "sync"
  7. )
  8. //定义任务队列
  9. var waitgroup sync.WaitGroup
  10. func xtgxiso(num int) {
  11. fmt.Println(num)
  12. time.Sleep(1*time.Second)
  13. waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1)
  14. }
  15. func main() {
  16. //设置最大的可同时使用的CPU核数和实际cpu核数一致
  17. runtime.GOMAXPROCS(runtime.NumCPU())
  18. for i := 0; i < 10; i++ {
  19. waitgroup.Add(1) //每创建一个goroutine,就把任务队列中任务的数量+1
  20. go xtgxiso(i)
  21. }
  22. waitgroup.Wait() //Wait()这里会发生阻塞,直到队列中所有的任务结束就会解除阻塞
  23. fmt.Println("finish")
  24. }

这样我们就完成了一个简单的程序,用runtime.GOMAXPROCS(runtime.NumCPU())来控制最大协程数量,用waitgroup.Wait()来等待所有子协程完成后主协程才退出!

参考:
http://www.xtgxiso.com/%E4%BD%BF%E7%94%A8sync-waitgroup%E6%9D%A5%E5%90%8C%E6%AD%A5golang%E7%A8%8B%E5%BA%8F/

分类: web

标签:   golang