Go では、sync.WaitGroup とチャネルによる同時実行性の管理が一般的です。ただし、初心者にとっては、ゴルーチンの完了期待を満たしているにもかかわらずプログラムが停止すると困惑することがあります。特定のケースを掘り下げて、根本的な問題を解明してみましょう。
開発者は、株価のリストを同時に取得するために、sync.WaitGroup とチャネル (fetchedSymbols) を利用するプログラムを実装しました。プログラムはゴルーチンの完了を待機している間、終了を拒否しました。
問題の根本は、fetchedSymbols チャネルを閉じないことにあります。 main 関数でこのチャネルを反復処理すると、プログラムは無期限にブロックされます。この場合、すべてのゴルーチンの完了時にチャネルのクローズを開始する必要があります。
プログラムのスムーズな実行を保証するために、開発者は sync.WaitGroup とトリガーを監視するヘルパー goroutine を導入しました。すべてのゴルーチンがタスクを完了すると、fetchedSymbols が閉じられます。これにより、ブロック動作が排除され、プログラムが正常に終了できるようになりました。
<code class="go">go func() { wg.Wait() close(fetchedSymbols) }() for response := range fetchedSymbols { fmt.Println("fetched " + response) }</code>
このソリューションを実装することにより、プログラムはすべての株価情報を正常にダウンロードした後に正常に終了し、Go の同時実行性を効率的に利用できるようになりました。特徴
以上がすべての goroutine が終了したにもかかわらず Go プログラムが停止するのはなぜですか? sync.WaitGroup とチャネル ブロックのガイド。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。