GO: golang sync WaitGroup

golang 的 sync 包,有一個很有用的功能;就是 WaitGroup 。
它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。

WaitGroup總共有三個方法:Add(delta int) / Done() / Wait()

  • Add:添加或者減少等待goroutine的數量
  • Done:相當於Add(-1)
  • Wait:執行阻塞,直到所有的WaitGroup數量變成0

Example

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i = i + 1 {
        wg.Add(1)
        go func(n int) {
            // defer wg.Done()
            defer wg.Add(-1)
            EchoNumber(n)
        }(i)
    }

    wg.Wait()
}

func EchoNumber(i int) {
    time.Sleep(3e9)
    fmt.Println(i)
}

Output

3
1
4
2
0

程序很簡單,只是將每次循環的數量過3秒鐘輸出。那麼,這個程序如果不用WaitGroup,那麼將看不見輸出結果。因爲 goroutine 還沒執行完,主線程已經執行完畢。
註釋的defer wg.Done()和defer wg.Add(-1)作用一樣。這個很好,原來執行腳本,都是使用time.Sleep,用一個估計的時間等到子線程執行完。WaitGroup很好。雖然chanel也能實現,但是覺得如果涉及不到子線程與主線程數據同步,這個感覺不錯。

文章來自:http://www.liguosong.com/2014/05/06/golang-sync-waitgroup/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章