WaitGroups を使用して Go アプリケーションでクリーン終了するためのチャネルを閉じる
この記事では、Go で sync.WaitGroup とチャネルを使用するときに直面する一般的な問題について調査します。これにより、すべての goroutine がタスクを完了した後に main 関数が終了するのを防ぐことができます。問題とその解決策を見てみましょう。
問題: 無限待機
提供された例では、main 関数は sync.WaitGroup とチャネル (fetchedSymbols) を利用します。株価を取得して保存する同時ゴルーチンを管理します。ゴルーチンがタスクを完了している間、プログラムは終了せずに無期限にハングします。
問題: 非クローズドチャネル
原因は main 関数の範囲ループです。 fetchedSymbols チャネルを反復処理すると、チャネルが閉じられることがないため、進行がブロックされます。その結果、main 関数は、すべての値がすでに受信されているにもかかわらず、チャネルを通じて新しい値が送信されるまで無期限に待機します。
解決策: チャネルを閉じる
この問題を解決するには、すべてのゴルーチンがタスクを完了した後に fetchedSymbols チャネルを閉じることが重要です。これにより、受信する値がもうないことが範囲ループに通知され、反復が終了して main 関数が続行できるようになります。
1 つの方法は、sync.WaitGroup の Wait メソッドを使用して、すべての値が受信されたときに通知することです。ゴルーチンが終了しました。 goroutine を起動して、WaitGroup がゼロに達するのを待ってからチャネルを閉じることができます。
<code class="go">go func() { wg.Wait() close(fetchedSymbols) }()</code>
この変更により、main 関数の範囲ループは最終的にチャネルの終わりに到達し、
sync.WaitGroup を使用するときにチャネルを閉じることの重要性を理解することで、Go 開発者は、同時タスクの実行後にアプリケーションが予測どおりに終了することを保証できます。
以上がWaitGroups と Channel を使用すると Go アプリケーションがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。