问题描述
假如一个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++只是一个简单的业务操作,这里可以填任意业务逻辑。