golang并发channel使用sync.WaitGroup保证所有协程结束并处理额外业务

问题描述

假如一个http请求是很多的数组id,服务端拿到数组id去执行业务,但是这个业务执行的时间教长,肯定不能循环执行,要让golang的多协程发挥作用,但是我想对某些id返回的结果做特殊处理,必须保证所有的协程都跑完了才能返回结果,我发现将id放进channel然后多个协程去消费思路是正确的,但是要保证所有的协程精确的跑完,用sync.WaitGroup挺合适的,也许还有更好的办法,但是这是我目前想的思路。

代码

package main

import (
   "fmt"
   "sync"
)

func main() {
   var ch chan int = make(chan int,10)
   var wg sync.WaitGroup
   var balance = [...]int{1,2,3,4,5,6,7,8,9}
    j := 0

   for m:=0;m< len(balance);m++{
      ch <- balance[m]
        wg.Add(1)
   }
   for n:=0;n< len(balance);n++  {
      go func() {
      s := <- ch
        fmt.Println("s ",s)
      if s==4||s==7 {
         j++
      }
      defer wg.Done()
      }()
   }
    wg.Wait()
   fmt.Println("j ",j)
   fmt.Println("执行完毕")
}

每向通道扔进去一个值就wg.Add(1),然后每一个通道的值被消费就 defer wg.Done(),直到为0时,wg.Wait()就不等待了表示所有协程运行结束了。
这样在最后面就会打印j为2,是正确的结果,当然j++只是一个简单的业务操作,这里可以填任意业务逻辑。

你可能感兴趣的:(golang)