如果你剛接觸Go語言並且想用它構建高並發,高性能的應用,弄明白WaitGroups是怎么回事很重要。
在本教程中,我們將掌握以下內容:
- WaitGroups的用途
- 一個WaitGroups的簡單示例
學習完本教程,你將會對WaitGroups有個全面的了解並且可以在你的高並發go應用中使用它。
理解WaitGroups
接下來我們就來看一下WaitGroups是什么以及它能為我們解決什么問題
當你在程序中使用go語言的協程的時候,在協程執行完成之前,你需要阻塞程序的執行。
請看以下代碼示例 :
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func main() { 8 fmt.Println("Hello World") 9 go myFunc() 10 fmt.Println("Finished Execution") 11 } 12 13 func myFunc() { 14 fmt.Println("Inside my goroutine") 15 }
程序輸出如下:
Hello World
Finished Execution
我們發現,程序並沒有輸出"Inside my goroutine",原因是主程序在協程執行之前就已經退出了。
如何解決?使用WaitGroups
WaitGroups可以通過阻塞主函數來幫我們解決上面的問題。
請看以下代碼:
1 package main 2 3 import ( 4 "sync" 5 "fmt" 6 ) 7 8 func main() { 9 fmt.Println("Hello World") 10 var waitgroup sync.WaitGroup 11 waitgroup.Add(1) 12 go myFunc(&waitgroup) 13 waitgroup.Wait() 14 15 fmt.Println("Finished Execution") 16 } 17 18 func myFunc(waitgroup *sync.WaitGroup) { 19 fmt.Println("Inside my goroutine") 20 waitgroup.Done() 21 }
上面代碼輸出結果為:
Hello World
Inside my goroutine
Finished Execution
達到了我們想要的結果。
接下來對上面的代碼做一些解釋:
我們在開啟協程之前,先調用了WaitGroup的Add(1)方法,是要設置主函數需要等待完成的協程數為1,Wait()方法是等待協程的完成。我們在協程中調用的WaitGroup的Done()方法,意思是當前協程執行完成(Done()做的工作其實就是把需要等待的協程個數減1),當需要等待的協程數為0時,則不需要再等待,繼續執行以下的代碼。
改造成匿名函數
我們可以把上面的例子改造成匿名函數的,代碼如下:
package main import ( "sync" "fmt" ) func main() { fmt.Println("Hello World") var waitgroup sync.WaitGroup waitgroup.Add(1) go func(){ fmt.Println("Inside my goroutine") waitgroup.Done() }() waitgroup.Wait() fmt.Println("Finished Execution") }
上面代碼輸出結果依然為:
Hello World
Inside my goroutine
Finished Execution