WaitGroupとは何か、Goでどのように使うか
Go言語のWaitGroupは、一連のgoroutineの実行完了を待機させるメカニズムです。主goroutineが終了する前に、すべてのサブgoroutineが完了するまで待機させます。
WaitGroup を使うには、まず sync パッケージをインポートする。次に、WaitGroup オブジェクトを作成し、Add メソッドで待機対象 Goroutine の数を設定する。その後、各子 Goroutine の最後に、Done メソッドを使用して子 Goroutine の終了をマークする。最後に、メイン Goroutine で Wait メソッドを使用して、全ての子 Goroutine の実行終了を待機する。
WaitGroupによる簡単な例を以下に示します。
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println("Goroutine", i, "is done")
}(i)
}
wg.Wait()
fmt.Println("All goroutines finished executing")
}
上記のサンプルでは、5つのサブゴルーチンを含むループを作成しています。 各サブゴルーチンは簡単なメッセージを出力し、最後には Done メソッドを呼び出します。 最後に、メインゴルーチンで Wait メソッドを呼び出して、すべての子ゴルーチンが実行を完了するのを待ちます。
上記のコードを実行すると、以下のような出力が得られます。
Goroutine 0 is done
Goroutine 1 is done
Goroutine 3 is done
Goroutine 4 is done
Goroutine 2 is done
All goroutines finished executing
全ての goroutine の実行が終わり、メイン goroutine が「すべての goroutine が完了しました」というメッセージを出力したことがわかる。
要約すると、WaitGroupはGo言語において、一連のgoroutineの実行完了を待機するための仕組みです。Addメソッドで待機が必要なgoroutine数を設定し、Doneメソッドでgoroutineの終了を通知し、Waitメソッドで全goroutineの実行完了を待機します。これは並行プログラミングにおいてよく用いられるテクニックです。