リアルタイムデータ処理: Go WaitGroupを使用したデータストリーム処理
Go言語において、リアルタイムのデータストリームを処理するために sync.WaitGroup を使用することができる。
sync.WaitGroup は、ゴルーチン群の終了を待機するための、カウント信号量です。主なメソッドには Add()、Done()、Wait() があります。
まず、`sync.WaitGroup` オブジェクトを作成し、それぞれのゴルーチンが開始する前に `Add()` メソッドを呼び出して待機するゴルーチンの数を 1 つ増やします。次に、ゴルーチンの末尾で `Done()` メソッドを呼び出して、このゴルーチンが終了したことを示します。最後に、メインゴルーチンで `Wait()` メソッドを呼び出して、すべてのゴルーチンが終了するのを待機します。
例えば、データストリームをリアルタイムで処理する必要があるとする。この場合の処理タスクは、各データの2乗の値を出力することである。
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
dataStream := []int{1, 2, 3, 4, 5}
for _, data := range dataStream {
wg.Add(1)
go process(data, &wg)
}
wg.Wait()
}
func process(data int, wg *sync.WaitGroup) {
defer wg.Done()
result := data * data
fmt.Println(result)
}
メイン関数では,まずsync.WaitGroupオブジェクトwgを作成します。次に,データストリームを反復処理し,各データに対して待機タスクを追加します。その後,各データを処理するためのgoroutineを開始し,引数として&wgを渡します。process()関数では,各データの2乗値を出力します,関数の終了時にwg.Done()を呼び出して,goroutineが終了したことを通知します。
最後にmain関数内でwg.Wait()を呼び出し、すべてのgoroutineが終了するのを待ちます。 これにより、すべてのデータが処理されるまでmain関数は終了しないことが保証されます。