Sync.WaitGroup: ゴルーチン同期用のチャネルの効率的な代替手段
Go でゴルーチンを同期する場合、通常、sync.WaitGroup とチャネルの両方が使用されたパターン。どちらの方法でも同様の結果が得られますが、特定の状況では sync.WaitGroup の方が適切な選択肢となる微妙な利点があります。
次のシナリオを考えてみましょう。
// Waitgroup example package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { words := []string{"foo", "bar", "baz"} for _, word := range words { wg.Add(1) go func(word string) { //... fmt.Println(word) wg.Done() }(word) } }
この場合、同期は.WaitGroup は、実行中のゴルーチンの数を追跡し、すべてのゴルーチンが完了するのを待ってからさらにコードを実行するための便利なメカニズムを提供します。これにより、次に進む前にすべてのタスクが完了していることを簡単に確認できます。
逆に、このタスクにチャネルを使用すると、より複雑でエラーが発生しやすくなります。
// Channel example package main import ( "fmt" "time" ) func main() { words := []string{"foo", "bar", "baz"} done := make(chan bool, len(words)) for _, word := range words { //... fmt.Println(word) done <- true } for range words { <-done } }
ここでは、完了しましたチャネルは各タスクの完了を通知するために使用され、メイン関数はすべての信号が受信されるまでブロックされます。このアプローチは機能的には sync.WaitGroup と同等ですが、すべてのゴルーチンが適切に同期されていることを確認するために追加のブックキーピングとエラー処理が必要です。
一般に、主な関心事が実行の完了を調整することである場合には、sync.WaitGroup が推奨されます。一方、チャネルは、ゴルーチン間のデータ交換を伴うシナリオや、同期のきめ細かい制御が必要な場合に適しています。特定の要件でチャネルの使用が必要でない限り、sync.WaitGroup は、Goroutine 同期タスクのためのよりシンプルでパフォーマンスの高いソリューションを提供します。
以上がGoroutine 同期のためにチャネルではなく `sync.WaitGroup` を選択するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。