ホームページ >バックエンド開発 >Golang >「runtime.Gosched()」は Go 1.5 の前後で Go プログラムの実行にどのような影響を与えますか?

「runtime.Gosched()」は Go 1.5 の前後で Go プログラムの実行にどのような影響を与えますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-30 14:37:16770ブラウズ

How Does `runtime.Gosched()` Impact Go Program Execution Before and After Go 1.5?

Gosched が Go プログラムの実行に与える影響

問題

1.5 より前の Go バージョンでは、runtime.Gosched() に関係するコードの出力に影響を与えることが観察されました。プログラム:

func say(s string) {
    for i := 0; i < 5; i++ {
        runtime.Gosched()
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

runtime を使用した出力.Gosched():

hello
world
hello
world
hello
world
hello
world
hello

runtime を使用しない出力.Gosched():

hello
hello
hello
hello
hello

説明

1.5 より前の Go バージョンでは、runtime.Gosched() が明示的に制御を他のものに譲っていました。呼び出されたときのゴルーチン。 Go プログラムはデフォルトで単一の OS スレッドで実行されますが、 runtime.Gosched() を使用すると、スケジューラはゴルーチン間で実行を切り替えることができました。

GOMAXPROCS が設定されていないか 1 に設定されている場合、Go の協調的なマルチタスクではゴルーチンが明示的に制御を譲る必要がありました。 。したがって、上記のコード例では、スケジューラが「world」 print ステートメントを実行する goroutine に切り替えることができるため、runtime.Gosched() が呼び出されたときにのみ「world」出力が表示されます。

GOMAXPROCS および協調マルチタスク

Go 1.5 以降では、runtime.GOMAXPROCS はデフォルトでハードウェア コアの数に設定されます。つまり、Go はゴルーチンを実行するために複数の OS スレッドを作成します。

GOMAXPROCS を 1 より大きい値に設定すると、ゴルーチンを並列実行できます。ただし、プリエンプティブ マルチタスク システムとは異なり、ゴルーチンは他のゴルーチンの実行を許可するために明示的に制御を渡す必要があります。これは、Go が協調的なマルチタスクを使用しており、ゴルーチンが自発的に制御をスケジューラーに明け渡すためです。

並列処理への影響

GOMAXPROCS を 1 より大きい値に設定すると、ゴルーチンをインターリーブした結果が不確定になる可能性があります。 、スケジューラがいつでもそれらの間で実行を切り替えることができるためです。これにより、GOMAXPROCS が 2 に設定された場合の上記の例に見られるように、予測できない出力パターンが発生する可能性があります。

以上が「runtime.Gosched()」は Go 1.5 の前後で Go プログラムの実行にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。