コンピュテーショナル интенсивные задачи: Go WaitGroupを使ってパフォーマンスを最適化
Go言語では、syncパッケージのWaitGroup型を使用して、計算量の大きいタスクのパフォーマンスを最適化できます。
WaitGroupとは、goroutineのグループが終了するのを待つためのカウンタです。計算量が多いタスクを実行するためにgoroutineのグループを開始したときに、WaitGroupを使用して、すべてのgoroutineが完了するのを待ってから後続の操作を続行できます。
以下に、WaitGroupを使用してパフォーマンスを最適化するサンプルコードを示します。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 设置要启动的goroutine数量
wg.Add(3)
// 启动goroutine执行计算密集型任务
go calculate(1, &wg)
go calculate(2, &wg)
go calculate(3, &wg)
// 等待所有的goroutine完成
wg.Wait()
// 继续执行后续的操作
fmt.Println("All goroutines completed")
}
func calculate(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Start goroutine %d\n", id)
// 模拟计算密集型任务
time.Sleep(time.Second * time.Duration(id))
fmt.Printf("End goroutine %d\n", id)
}
このコードでは最初にWaitGroupの変数wgを作成し、wg.Add(3)によって開始するgoroutineの数を3に設定します。
次に、処理負荷の高いタスクを処理するために、go calculate(1, &wg)の形式で3つのgoroutineを起動しました。各goroutineでは、defer wg.Done()を利用してそのgoroutineの終了をマークしました。
最後に wg.Wait() を呼び出し、すべての goroutine が完了するのを待った後、後続の処理を実行します。
WaitGroupを利用することで、全てのgoroutineが完了するのを待ってから後続の処理を行うことができ、パフォーマンス最適化を図れます。