Golang中的sync.WaitGroup用法实例
WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。
官方对它的说明如下:
AWaitGroupwaitsforacollectionofgoroutinestofinish.ThemaingoroutinecallsAddtosetthenumberofgoroutinestowaitfor.TheneachofthegoroutinesrunsandcallsDonewhenfinished.Atthesametime,Waitcanbeusedtoblockuntilallgoroutineshavefinished.
sync.WaitGroup只有3个方法,Add(),Done(),Wait()。
其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0,阻塞Wait()的运行。
例子代码如下:
同时开三个协程去请求网页,等三个请求都完成后才继续Wait之后的工作。
varwgsync.WaitGroup
varurls=[]string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.somestupidname.com/",
}
for_,url:=rangeurls{
//IncrementtheWaitGroupcounter.
wg.Add(1)
//LaunchagoroutinetofetchtheURL.
gofunc(urlstring){
//Decrementthecounterwhenthegoroutinecompletes.
deferwg.Done()
//FetchtheURL.
http.Get(url)
}(url)
}
//WaitforallHTTPfetchestocomplete.
wg.Wait()
或者下面的测试代码
用于测试给chan发送1千万次,并接受1千万次的性能。
packagemain
import(
"fmt"
"sync"
"time"
)
const(
num=10000000
)
funcmain(){
TestFunc("testchan",TestChan)
}
funcTestFunc(namestring,ffunc()){
st:=time.Now().UnixNano()
f()
fmt.Printf("task%scost%d\r\n",name,(time.Now().UnixNano()-st)/int64(time.Millisecond))
}
funcTestChan(){
varwgsync.WaitGroup
c:=make(chanstring)
wg.Add(1)
gofunc(){
for_=rangec{
}
wg.Done()
}()
fori:=0;i<num;i++{
c<-"123"
}
close(c)
wg.Wait()
}