Go言語のコンカレンシー制御とWaitGroup

Golangのコンカレンシー制御では、goroutineの実行を管理するためにsync.WaitGroupなどの機構を利用します。

sync.WaitGroupはGoroutine群の完了を待つ、Go言語標準ライブラリの構造体です。これは次の3つのメソッドを提供します。

  1. Add(delta int):待機 Goroutine の数を追加します。正の値は追加、負の値は削除を表します。
  2. Done():goroutineの終了を知らせて、待機中のgoroutineを減らす。
  3. 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の実行完了を待ってから次の処理に移行できます。

bannerAds