GoのWaitGroupによる高効率な並行プログラミング:実践的なテクニック
Go言語では、WaitGroupは並行処理タスクを管理するための非常に便利なツールです。これを使用して、一連の並行処理タスクが完了するまで後続のコードを実行するのを待つことができます。
並行処理で効率的なプログラムを書く際に役立つ、WaitGroupの利用に関する実践的なヒントを紹介します。
- ジョブをWaitGroupに追加する: 並列ジョブを実行する前に、ジョブをWaitGroupに追加する必要があります。Addメソッドを使用して、待機するジョブ数を増やすことができます。例えば:
var wg sync.WaitGroup
wg.Add(1) // 添加一个任务到WaitGroup
- コンカレントタスクでDoneメソッドを利用する:コンカレントタスクが完了したら,WaitGroupに対してその完了を通知するためにDoneメソッドを呼び出す必要があります.例:
go func() {
// 并发任务的代码逻辑
wg.Done() // 任务完成后调用Done方法
}()
- Waitメソッドで全タスクの完了を待つ: 全ての並行タスクがWaitGroupに追加され、実行が完了すると、Waitメソッドで全タスクの完了を待機できます。例:
wg.Wait() // 等待所有任务完成
- WaitGroupを用いた並列タスクのタイムアウト制御: WaitGroupのWaitメソッドとタイマーを併用することで、並列タスクのタイムアウト制御を実現できます。
go func() {
// 并发任务的代码逻辑
wg.Done() // 任务完成后调用Done方法
}()
go func() {
time.Sleep(5 * time.Second) // 设置一个定时器,等待5秒钟
wg.Done() // 超时后调用Done方法
}()
wg.Wait() // 等待所有任务完成
- 並行タスクのエラー処理におけるWaitGroupの活用:並行タスクにおいてエラーを捕捉し、タスクが完了した後にエラー情報を記録することが可能です。
var (
mu sync.Mutex
count int
errs []error
)
wg.Add(1)
go func() {
defer wg.Done()
// 并发任务的代码逻辑
err := doSomething()
if err != nil {
mu.Lock()
errs = append(errs, err)
mu.Unlock()
}
}()
wg.Wait()
// 检查是否有错误发生
if len(errs) > 0 {
// 处理错误
}
Goによる並行処理を効率的に書くためのWaitGroup活用テクニックを紹介しています。ぜひ参考にしてみてください。