waitGroup精准等待协程执行

53 阅读1分钟

1.不使用waitGroup的时候,使用sleep粗糙等待协程

sleep的方式明显的弊端在于,时间是等待1s,100s,1000s ??? 自己是无法精准估算的
那有什么办法可以解决这个【不知道传多少时间】的问题???
答案:使用 waitGroup

func main() {
   for i := 0; i < 100; i++ {
      go func(i int) {
         fmt.Println(i)
      }(i)
   }
   time.Sleep(1 * time.Second)
}

2.使用waitGroup精准等待协程执行

wg.Add(100) 相当于告诉调度器,即将要开100个go协程
wg.Done( ) 相当于告诉调度器,1个go协程执行完毕【会在100里面减1】
wg.Wait( ) 相当于告诉调度器,main协程等待时间到【查看100是不是减到0】

func main() {
   var wg sync.WaitGroup
   wg.Add(100)
   for i := 0; i < 100; i++ {
      go func(i int) {
         fmt.Println(i)
         wg.Done()
      }(i)
   }
   wg.Wait()
}

如果100无法提前得知,那么一般会采用启动一个协程,wg.Add(1)一下来逐渐达到总协程数100

func main() {
   var wg sync.WaitGroup
   for i := 0; i < 100; i++ {
      go func(i int) {
         wg.Add(1)
         fmt.Println(i)
         wg.Done()
      }(i)
   }
   wg.Wait()
}