GOMAXPROCS を 2 に設定しても、プログラムが損なわれたままになる
runtime.GOMAXPROCS(2) を設定しているにもかかわらず、プログラムで数値の出力中に中断の問題が発生する。高い CPU 使用率が観察されていますが、誤動作の原因は依然として解明されていません。
提供されたコードには、forever()、ビジー ループ、および無限ループで数値を出力する show() という 2 つのゴルーチンが含まれています。 main 関数は、2 つの CPU コアを使用するように GOMAXPROCS を設定します。ただし、プログラムは応答しなくなります。
問題は、forever() の継続的な操作にあります。常に実行すると、OS スレッド全体が消費され、ランタイムの goroutine スケジューリングが中断されます。特に Go 1.5 では、ガベージ コレクションの stop-the-world フェーズが妨げられます。
これを解決するには、forever() のビジー ループを定期的に CPU を生成する関数に置き換えることができます。または、無限ループが不要なため、完全に削除することもできます。
たとえば、forever() を次のように変更すると、問題が解決します。
func forever() { for { runtime.Gosched() } }
スケジュール ポイントをループを実行すると、ゴルーチンは制御を放棄し、他のゴルーチンの実行を許可することができます。これにより、コア機能を担当するゴルーチンを含むすべてのゴルーチンが効率的に実行できるようになります。
以上が「runtime.GOMAXPROCS(2)」を設定しているにもかかわらず Go プログラムがフリーズするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。