golang--sync.WaitGroup使用示例

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 

猜你喜欢

转载自blog.csdn.net/weixin_44282540/article/details/88670631