WaitGroup:主要包括Add,Done,Wait三個方法,Add表示添加一個goroutine,Done等於Add(-1),表示一個goroutine結束,wait表示主線程一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成.
但在使用的時候發現進程一直阻塞,代碼如下:
func Exec(url string, wg sync.WaitGroup) error{
statusCode, body, err := fasthttp.Get(nil, url)
if err != nil{
log.Fatalf("err,%s", err)
return err
}
if statusCode != fasthttp.StatusOK {
log.Fatalf("Unexpected status code: %d")
return err
}
ParseBody(body)
wg.Done()
return nil
}
func main(){
var URL string
URL = "http://192.168.2.112:61208/"
num := 100
var wg sync.WaitGroup
wg.Add(num)
startTime := time.Now()
for i:=0; i<num; i++{
go Exec(URL, wg)
}
wg.Wait()
endTime := time.Now()
spendTime := endTime.Sub(startTime)
log.Println(spendTime)
}
將sync.WaitGroup放在main中做done就可以正常運行:
func main(){
var URL string
URL = "http://192.168.2.112:61208/"
num := 100
var wg sync.WaitGroup
wg.Add(num)
startTime := time.Now()
for i:=0; i<num; i++{
go func(){
statusCode, body, err := fasthttp.Get(nil, url)
if err != nil{
log.Fatalf("err,%s", err)
}
if statusCode != fasthttp.StatusOK {
log.Fatalf("Unexpected status code: %d")
}
ParseBody(body)
wg.Done()
}
}
wg.Wait()
endTime := time.Now()
spendTime := endTime.Sub(startTime)
log.Println(spendTime)
}
一直阻塞應該是死鎖了,也就是wg.Done()沒起作用,原來是wg 給拷貝傳遞到了 goroutine 中,導致只有 Add 操作,其實 Done操作是在 wg 的副本執行導致的~~ 將wg 的傳入類型改爲 *sync.WaitGrou,這樣就能引用到正確的WaitGroup了
func Exec(url string, wg *sync.WaitGroup) error{
statusCode, body, err := fasthttp.Get(nil, url)
if err != nil{
log.Fatalf("err,%s", err)
return err
}
if statusCode != fasthttp.StatusOK {
log.Fatalf("Unexpected status code: %d")
return err
}
ParseBody(body)
wg.Done()
return nil
}
func main(){
var URL string
URL = "http://192.168.2.112:61208/"
num := 100
var wg sync.WaitGroup
wg.Add(num)
startTime := time.Now()
for i:=0; i<num; i++{
go Exec(URL, &wg)
}
wg.Wait()
endTime := time.Now()
spendTime := endTime.Sub(startTime)
log.Println(spendTime)
}