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」出力が表示されます。
Go 1.5 以降では、runtime.GOMAXPROCS はデフォルトでハードウェア コアの数に設定されます。つまり、Go はゴルーチンを実行するために複数の OS スレッドを作成します。
GOMAXPROCS を 1 より大きい値に設定すると、ゴルーチンを並列実行できます。ただし、プリエンプティブ マルチタスク システムとは異なり、ゴルーチンは他のゴルーチンの実行を許可するために明示的に制御を渡す必要があります。これは、Go が協調的なマルチタスクを使用しており、ゴルーチンが自発的に制御をスケジューラーに明け渡すためです。
GOMAXPROCS を 1 より大きい値に設定すると、ゴルーチンをインターリーブした結果が不確定になる可能性があります。 、スケジューラがいつでもそれらの間で実行を切り替えることができるためです。これにより、GOMAXPROCS が 2 に設定された場合の上記の例に見られるように、予測できない出力パターンが発生する可能性があります。
以上が「runtime.Gosched()」は Go 1.5 の前後で Go プログラムの実行にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。