runtime.Gosched: 協調マルチタスクの制御を譲る
Go では、 runtime.Gosched 関数は現在のゴルーチンの制御を明示的に放棄し、スケジューラを使用して実行を別のゴルーチンに切り替えます。このメカニズムは Go のランタイムで採用されている協調的なマルチタスクにとって重要であり、ゴルーチンが OS レベルのスレッド プリエンプションに依存せずに CPU 時間を共有できるようになります。
次のコード スニペットを考えてみましょう。
package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") }
Inこの例では、2 つのゴルーチンが作成されます。メインのゴルーチンと、「world」の出力を担当する 2 番目のゴルーチンです。 runtime.Gosched() を使用しない場合、メインの goroutine は他の goroutine に制御を譲ることなく継続的に実行され、次のような出力が得られます。
hello hello hello hello hello
ただし、runtime.Gosched() を使用すると、スケジューラーは 2 つの goroutine の間で実行を切り替えます。各反復でゴルーチンを実行し、インターリーブされた出力を生成します:
hello world hello world hello world hello world hello
理由runtime.Gosched() は実行に影響します
runtime.Gosched() が呼び出されると、次のことが発生します:
協調的なマルチタスクは、runtime.Gosched() などのメカニズムやチャネルなどの同時実行プリミティブを使用して制御を明示的に譲り渡すゴルーチンに依存します。対照的に、最新のオペレーティング システムで採用されているプリエンプティブ マルチタスクでは、ゴルーチンが関与することなく、スレッド間で実行コンテキストを透過的に切り替えます。
GOMAXPROCS と実行
GOMAXPROCS 環境変数Go ランタイムが goroutine の実行に使用できる OS スレッドの最大数を制御します。 GOMAXPROCS が 0 (デフォルト) または 1 に設定されている場合、ランタイムは単一のスレッドを使用します。このシナリオでは、ゴルーチンが連携して CPU 時間を共有するために runtime.Gosched() が不可欠になります。
GOMAXPROCS が 1 より大きい値に設定されている場合、ランタイムは複数の OS スレッドを作成できます。この場合、ゴルーチンは異なるスレッドで同時に実行できるため、明示的に譲歩する必要性が減ります。その結果、runtime.Gosched() が実行に与える影響は少なくなる可能性があります。
以上が`runtime.Gosched()` は Go での Goroutine の実行にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。