WaitGroupについて
syncパッケージ
syncパッケージには低水準のメモリアクセス同期に便利な並行処理のプリミティブが入っている
WaitGroup
ひとまとまりの平行処理があったとき、その結果を気にしない、もしくは他に結果を集約する手段があるときに、それらの処理の完了を待つ手段として非常に強力
つまりどの順番で終わるかは確約されてないってこと???
使い方
- Addに引数を渡して呼び出し、その数だけのゴルーチンが起動したことを表す
- Doneをdeferキーワードを使って呼び出し、ゴルーチンのクロージャーが終了する前にWaitGroupを確実に終了する
- Waitを呼び出すことで、この時点ですべてのゴルーチンが終了するまでメインゴルーチンをロックする
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() fmt.Println("1st goroutine sleeping...") // time.Sleep(1*time.Second) time.Sleep(1) }() wg.Add(1) go func() { defer wg.Done() fmt.Println("2nd goroutine sleeping...") // time.Sleep(2*time.Second) time.Sleep(1) }() wg.Wait() fmt.Println("All goroutines complete.") } // 出力結果 // 2nd goroutine sleeping... // 1st goroutine sleeping... // All goroutines complete.
このプログラムの出力結果は上のようになる。 何回かに一回は、1st → 2nd の順番になる。
(やっぱりこれは順番までは確保してくれないよ〜〜ってことの表れなのか??)
順番を気にしない平行処理に向いている