關於go語言中的WaitGroup


如果你剛接觸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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM