高速応答:GoのWaitGroupの同時実行性の高いシーンでの応用
高並行処理シナリオで、GoのWaitGroupはgoroutine群が自身のタスクを終了するのを待つための効果的なツールです。
WaitGroup には、3 つのメソッドが使用できます。
- Add(n int):待機中の Goroutine 数にnを加算する。
- Done(): 同時に待機しているgoroutineの数を1減らす。
- Wait():待機する goroutine の個数がゼロになるまで、ブロッキング待機する。
高並行環境で Goroutine を使用してタスクを処理し、WaitGroup を使用してすべての Goroutine が完了するのを待つサンプルコードを以下に示します。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
time.Sleep(time.Second) // 模拟任务处理时间
fmt.Printf("Task %d completed\n", n)
}(i)
}
wg.Wait() // 等待所有任务完成
fmt.Println("All tasks completed")
}
上のコードでは、10個のgoroutineを作成し、それぞれにタスクを処理させました。各goroutineはタスクの処理が完了すると、待機中のgoroutineの数を減らすためにDone()メソッドを呼び出します。最後に、すべてのgoroutineがタスクを完了するまで待機するために、Wait()メソッドを呼び出してブロックします。
WaitGroupを利用することで、高并发な場面で全てのgoroutineがタスクを完了してから後続の処理を実行できます。