GoでのコンカレンシーにおけるWaitGroupの活用

GoではWaitGroupを使って並行goroutineを管理し、すべてのgoroutineが完了するまでメインプログラムが終了しないようにすることができます。

WaitGroupは、初期値が0のカウンタセマフォです。各goroutineは実行開始前にWaitGroupのAddメソッドを呼び出し、カウンタをインクリメントします。そして、goroutineの最後で、WaitGroupのDoneメソッドを呼び出し、カウンタをデクリメントします。mainルーチンは、WaitGroupのWaitメソッドを呼び出すと、すべてのgoroutineのカウンタが0になるまでブロックされます。

WaitGroupを使用した例は以下となります。

package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
fmt.Printf("goroutine %d\n", id)
}(i)
}
wg.Wait()
fmt.Println("All goroutines have finished")
}

上記の例では、メインプロセスは 5 つのコルーチンを開始し、 wg.Add(1) をコールすることでカウントを 1 つ追加します。各コルーチンはタスクの実行が完了すると、 wg.Done() をコールすることでカウントを 1 つ減らします。最後に、メインプロセスが wg.Wait() をコールすると、すべてのコルーチンのカウントが 0 になるまでブロックされます。すべてのコルーチンが完了すると、メインプロセスは「All goroutines have finished」を出力します。

WaitGroupを使うことで、並列実行されたgoroutineを簡単に管理し、それらの実行順序とメインプログラムの終了順序の一致を保証できます。

bannerAds