ホームページ  >  記事  >  バックエンド開発  >  **WaitGroup とチャネルを使用する Golang プログラムが無制限に実行されるのはなぜですか?**

**WaitGroup とチャネルを使用する Golang プログラムが無制限に実行されるのはなぜですか?**

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 09:46:29767ブラウズ

**Why Does My Golang Program Using WaitGroup and Channels Run Indefinitely?**

Golang プログラムでの WaitGroup とチャネルの使用法

この Golang プログラムは、sync.WaitGroup とチャネルを利用して、効率的な goroutine の実行とデータ収集を実現します。ただし、タスクの完了後にプログラムが終了しないという問題が発生します。この記事では、この問題を詳しく掘り下げ、解決策を示します。

プログラムには、シンボルのリストの株価を取得し、結果をファイルに保存することが含まれます。ゴルーチンとチャネルの組み合わせを使用して取得プロセスを同時に実行し、すべてのタスクの完了を追跡する WaitGroup を使用します。ただし、fetchedSymbols チャネルが無期限に開いたままになるため、プログラムは無限ループに陥ります。

この問題を解決するには、プログラムはすべてのゴルーチンのタスクが終了した後に fetchedSymbols チャネルを閉じる必要があります。すでにゴルーチンの完了を追跡している WaitGroup をこの目的に利用できます。 WaitGroup がゼロに達したときにチャネルを閉じる go func() ラッパーを追加することで、問題は解決されます。

コードの変更されたセクションは次のとおりです。

<code class="go">...
go func() {
    wg.Wait()
    close(fetchedSymbols)
}()

for response := range fetchedSymbols {
    fmt.Println("fetched " + response)
}

...</code>

追加された go func() ルーチンは、WaitGroup がゼロに達し、すべてのゴルーチンがタスクを完了したことを示します。次に、fetchedSymbols チャネルを閉じて、メインの範囲ループが期待どおりに終了し、プログラムの実行を完了できるようにします。

この改良されたプログラムは、Goroutine の同時実行とデータ取得のために WaitGroup とチャネルを効果的に利用し、終了します。必要なタスクをすべて完了したら、優雅に。

以上が**WaitGroup とチャネルを使用する Golang プログラムが無制限に実行されるのはなぜですか?**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。