ホームページ > バックエンド開発 > Golang > GOMAXPROCS(2) を設定し、CPU 使用率を高めているにもかかわらず、Go プログラムがハングするのはなぜですか?

GOMAXPROCS(2) を設定し、CPU 使用率を高めているにもかかわらず、Go プログラムがハングするのはなぜですか?

Patricia Arquette
リリース: 2024-12-11 04:45:14
オリジナル
338 人が閲覧しました

Why Does My Go Program Hang Despite Setting GOMAXPROCS(2) and High CPU Usage?

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

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