golang中有2种方式同步程序, 一种是channel ,一种是使用锁机制.
而sync.WaitGroup是一种较为简单的同步方法集,sync.waitGroup 只有三个方法,Add() , Done() ,Wait() . 其中Done()是Add(-1)的别名. 简单的来讲,使用add()添加计数,Done()减掉一个计数,不计数为0.阻塞wait()的运行.add()在主函数中运行,Done()这个函数在其他函数中运行.这个是已经踩过的雷.
从下面这个简单的例子中可以体会go并发的机制,程序演示了单个 channel 同时发送和接受多个 goroutines 的数据。它也展示了 select 语句如何从多个通信操作中选择执行。
package main
func main(){
people:=[]string{"A","B","C","D","E"}
match:= make(chan string ,1)
wg:=new(sync.WaitGourp)
for _,name:=range people{
wg.Add(1),
go Seek(name, wg,match)
}
wg.Wait()
select {
case name:=<-match:
fmt.Printf("only one is %s \n",name)
default:
//没有待处理的发送操作
}
}
//寻求发送或接受匹配上名称名称的通道,并在完成后通知等待组.
func Seek(name string, wg *sync.WaitGroup,match chan string){
select{
case peer:=<-match:
fmt.Printf("%s message from %s \n",name,peer)
case match<-name:
}
wg.Done()
}
得出来的结果:
A message from E
C message from B
only one is D