🐕
goでただ並列実行をしたいだけの時のコード
func main() {
var wg sync.WaitGroup
queries := []string{
"SELECT name FROM users WHERE id = 1",
"SELECT name FROM users WHERE id = 2",
"SELECT name FROM users WHERE id = 3",
}
for _, query := range queries {
wg.Add(1)
go fetchData(query, &wg)
}
wg.Wait()
fmt.Println("All queries are fetched")
}
func fetchData(query string, wg *sync.WaitGroup) {
defer wg.Done()
// ここに並列実行したい処理を書く
fmt.Println(query)
}
各タスクに次の工程がある場合はチャネルで待ってもよいが、特に次がない場合はWaitGroupで十分。
実行数が膨れ上がる可能性がある場合はチャネルを使って上限を管理するとよい。
Discussion
こんにちは!
fetchData
の引数にWaitGroup
を持たせると用途が限定されてくるので、呼び出しで無名関数を使うのも手ですね。