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() }