WaitGroup の使い方と実例の詳細な解説
WaitGroup とは Go 言語の並行制御機構で、goroutine 群の終了を待機するのに使われます。WaitGroup は Add、Done、Wait という 3 つのメソッドを提供します。
- WaitGroup の待機するgoroutineをセットするためのメソッド。Addメソッドの引数は、int型で待機が必要なgoroutineの数を表す。通常、goroutineを起動する前に Add メソッドを呼び出し、待機するgoroutineの数を増やす。
- WaitGroupに1つのgoroutineの終了を通知する方法 goroutineの最後でDoneメソッドを呼び出すことで、WaitGroupが待機するgoroutineの数を減らす
- WaitGroup内の待機goroutineの数が0になるまで、現在のgoroutineをブロックするために使用されるWaitメソッド。一般的に、主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.Printf("goroutine %d\n", i)
}(i)
}
wg.Wait()
fmt.Println("All goroutines finished")
}
これらの例では、はじめにWaitGroupオブジェクトのwgが作成されます。そして、forループを使用して5つのゴルーチンを起動し、各ゴルーチンでwg.Add(1)を呼び出してWaitGroupで待機中のゴルーチンの数を増やします。各ゴルーチンの最後にwg.Done()を呼び出して、WaitGroupに1つのゴルーチンが終了したことを伝えます。最後に、メインのゴルーチンでwg.Wait()を呼び出して、すべてのサブゴルーチンが終了するのを待ちます。
このコードを実行すると、次の行に似た出力が生成されることがあります。
goroutine 4
goroutine 0
goroutine 3
goroutine 2
goroutine 1
All goroutines finished
ゴルーチンごとの出力がランダムな順序になることが分かる。これは、それらが同時実行されるためである。
WaitGroupは、複数のgoroutineが終了するのを待つためのGo言語のメカニズムです。Add、Done、およびWaitメソッドを呼び出すことで、複数のgoroutineを並行して制御できます。