ホームページ > バックエンド開発 > Golang > 「runtime.GOMAXPROCS(2)」を設定しているにもかかわらず Go プログラムがフリーズするのはなぜですか?

「runtime.GOMAXPROCS(2)」を設定しているにもかかわらず Go プログラムがフリーズするのはなぜですか?

Barbara Streisand
リリース: 2024-12-13 12:37:10
オリジナル
679 人が閲覧しました

Why Does My Go Program Freeze Despite Setting `runtime.GOMAXPROCS(2)`?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート