Go言語のコンカレンシー制御とWaitGroup
Golangのコンカレンシー制御では、goroutineの実行を管理するためにsync.WaitGroupなどの機構を利用します。
sync.WaitGroupはGoroutine群の完了を待つ、Go言語標準ライブラリの構造体です。これは次の3つのメソッドを提供します。
- Add(delta int):待機 Goroutine の数を追加します。正の値は追加、負の値は削除を表します。
- Done():goroutineの終了を知らせて、待機中のgoroutineを減らす。
- Wait(): すべての待ちゴルーチンが実行されるまでブロックする。
以下にsync.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, "done")
}(i)
}
wg.Wait()
fmt.Println("all goroutines done")
}
上記の例では、まず `sync.WaitGroup` インスタンス `wg` を作成しています。次に、`Add` メソッドを使って、待機する goroutine の数を 5 つ増やします。次に、`go` キーワードを使って 5 つの goroutine を作成し、それぞれが自分の id をプリントし、実行完了を知らせる Done 関数を呼び出します。最後に、すべての goroutine の完了を待つまで `wg.Wait()` メソッドを呼び出します。
それぞれのゴルーチン中で、sync.WaitGroup に完了を知らせるために Done メソッドの呼び出しが必要なことに注意してください。そうでなければ、Wait メソッドは永久にブロックされます。
同期化処理のsync.WaitGroupを使えば、複数のgoroutineの並列実行を簡単に管理し、全てのgoroutineの実行完了を待ってから次の処理に移行できます。