効率的な並行プログラミングの実践:GoのWaitGroupの活用テクニック
GoのWaitGroupは、一連のgoroutineがタスクを完了するのを待つことができる並行プリミティブです。ここでは、効率的な並行プログラミングを実現するためのWaitGroupを使用するテクニックをいくつか紹介します。
- WaitGroupオブジェクトを作成する:最初にWaitGroupオブジェクトを作成する必要があります。通常、syncパッケージ内のWaitGroup型が使用されます。WaitGroup変数はvarキーワードで宣言し、WaitGroupのAddメソッドを使用して待機するgoroutineの数を設定します。
var wg sync.WaitGroup
wg.Add(2) // 设置需要等待的goroutine数量
- ゴルーチン起動: ゴルーチンは、処理を待つことができるように起動できます。ゴルーチンの内部で、タスクが完了したら、WaitGroupのDoneメソッドを呼び出して、WaitGroupにタスクが完了したことを通知する必要があります。
go func() {
defer wg.Done() // 任务完成后通知WaitGroup
// 执行任务逻辑
}()
go func() {
defer wg.Done() // 任务完成后通知WaitGroup
// 执行任务逻辑
}()
- goroutine の完了を待つ: 最後に、WaitGroup の `Wait` メソッドを呼び出して、すべての goroutine がタスクを完了するのを待ちます。`Wait` メソッドは、待機中のすべての goroutine が `Done` メソッドを呼び出すまで、現在の goroutine をブロックします。
wg.Wait() // 等待所有goroutine完成任务
WaitGroupを利用することで、全てのgoroutineが処理を終えてから、以降のロジックを実行するようにできます。
また、下記注意事項にも十分ご留意ください。
- goroutineを起動する前にAddメソッドを呼び出さないと、デッドロックが発生する可能性があります。
- goroutine内でdefer文を使ってDoneメソッドを呼び出し、タスク完了後に確実にDoneメソッドが呼ばれるようにする。
- WaitGroup変数を複数のgoroutine間で共有せず、各goroutineにWaitGroupを引数として渡すべきです。
総じてWaitGroupを用いることで、一連のgoroutineがタスクを完了するのを手軽に待ち受けて効率的な並行プログラミングを実現できる。