Go WaitGroupとGoによる並列処理のベスト・プラクティス
GoのWaitGroupは、ゴルーチン群の完了まで待つために非常に便利な、並行プログラミングのツールです。Goにおいて、WaitGroupはゴルーチン群のタスク完了を待つためのカウンタ付きセマフォです。
WaitGroup を使用した Go の並列プログラミングのベストプラクティスをご紹介します。
- WaitGroupの作成: まず、WaitGroupオブジェクトを作成する必要があります。syncパッケージのWaitGroupのNew()関数を呼び出すことで新しいWaitGroupを作成できます。 たとえば、
var wg sync.WaitGroup
- カウンタを増やす:ゴルーチンを開始する前、WaitGroup のカウンタを増やすため、WaitGroup で Add() 関数を実行する必要があります。例:
wg.Add(1)
- Goルーチンの起動: 新しいGoルーチンを起動したら、Goルーチンの内部でDone()関数を呼び出すことでWaitGroupのカウンタを減算する必要があります。例:
go func() {
defer wg.Done()
// 执行任务的代码
}()
- メイン Goroutine では、すべての Goroutine が完了するまで待つためにWaitGroupを使用して、wait() 関数を使います。これによって、WaitGroup のカウントがゼロになるまで、メイン Goroutine はブロックされます。
wg.Wait()
- エラー処理:並行処理の際はエラー処理に注意が必要。 deferキーワードを利用し、発生する可能性のあるpanicを捕捉し、エラー発生時にはカウンターを確実に減らすためDone()関数を呼び出す。
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("goroutine crashed:", r)
}
wg.Done()
}()
// 执行任务的代码
}()
- コンカレンシー安全性:コンカレントプログラミングでは、共有リソースの同時アクセスに注意する必要があります。共有リソースを保護するには、Mutexやその他のコンカレントセーフなデータ構造を使用できます。共有リソースにアクセスする際には、適切な同期処理を実行してください。
WaitGroupとGoのコンカレンシープログラミングにおけるベストプラクティスです。WaitGroupを使用すると、一連のgoroutineがタスクを完了するのを容易に待機し、すべてのタスクが完了した後に次のステップに進むことができます。また、コンカレンシーセーフティとエラー処理の問題にも注意を払う必要があり、プログラムの正確性と安定性を確保する必要があります。