GOMAXPROCS(2) の設定後にハングする
runtime.GOMAXPROCS(2) を使用して 2 つの同時スレッドを許可するようにプログラムを構成しました。ただし、CPU 使用率が高くても、数値の出力中にプログラムがハングアップします。
この問題は、forever() 関数にビジー ループが存在するために発生します。ビジー ループは、制御をスケジューラに放棄することなく継続的に実行されます。この場合、forever() 関数は事実上、使用可能なスレッドの 1 つを無期限に消費します。
この動作は、残りのスレッドを show() 関数に割り当てるスケジューラの機能を妨げます。そのため、プログラムは次のように見えます。下がる。また、show() 関数は、反復間で 1000 ミリ秒スリープするため非効率になります。
解決策
この問題を解決するには、永遠のループからビジー ループを削除する必要があります。 () 関数を使用し、show() 関数内にスケジューリング ポイントを実装します。スケジューリング ポイントを使用すると、スケジューラーが定期的に制御を取り戻すことができ、すべてのゴルーチンが実行できるようになります。
変更されたコードは次のとおりです。
func forever() { for { runtime.Gosched() } } func show() { for number := 1; number < 999999; number++ { time.Sleep(1000) runtime.Gosched() fmt.Println(number) } }
次の場所に runtime.Gosched() を追加します。 show() 関数の for ループの最後で問題を解決し、プログラムをスムーズに実行できるようにすることができます。
以上がGOMAXPROCS(2) を設定し、CPU 使用率を高めているにもかかわらず、Go プログラムがハングするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。