Go の "throw: All Goroutines Are Asleep - Deadlock" を理解する
単純な Go プログラムの実行中に、エラー メッセージが表示される場合があります。 「スロー: すべてのゴルーチンがスリープ中 - デッドロック!」このエラーは、実行中のすべてのゴルーチンがデータの送受信を行わない通信チャネルを待機している場合に発生します。この問題に対処するには、このデッドロックの背後にある原因を理解することが重要です。
指定された Go プログラムでは、3 つの整数の合計を計算するゴルーチンが生成されます。メインのゴルーチンはこれらの整数をチャネルに送信し、結果を待ちます。ただし、チャネルが閉じられていないため、ゴルーチンは無限ループにはまってしまいます。
ゴルーチンで範囲ループを終了するには、閉じられたチャネルが必要です。ただし、チャネルは開いたままであるため、ループは無限に続きます。これにより、すべてのゴルーチンが決して発生しないイベントを待機することになり、デッドロックが発生します。
この問題を解決するには、データ転送が完了したときにチャネルを閉じることが不可欠です。プログラムの修正バージョンでは、結果を送り返すために 2 番目のチャネルが導入されています。 total 関数は、この新しいチャネルを通じて整数の合計を送り返し、メインのゴルーチンはこのチャネルから結果を受け取ります。さらに、元のチャネルはデータ転送の終了を通知するために閉じられます。
このようにプログラムを変更することで、ゴルーチンが無限ループに陥ることがなくなり、デッドロックが防止されます。これは、Go プログラムのデッドロックを回避するためにチャネルを適切に閉じることの重要性を強調しています。
以上が私の Go プログラムが「すべてのゴルーチンがスリープしています - デッドロック」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。