ホームページ > バックエンド開発 > Golang > `runtime.Gosched()` は Go での Goroutine の実行にどのような影響を与えますか?

`runtime.Gosched()` は Go での Goroutine の実行にどのような影響を与えますか?

Linda Hamilton
リリース: 2024-12-22 05:18:14
オリジナル
404 人が閲覧しました

How Does `runtime.Gosched()` Impact Goroutine Execution in Go?

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() が呼び出されると、次のことが発生します:

  • 現在の goroutine は実行を一時停止します。
  • スケジューラは、スケジューリング アルゴリズムとシステムに基づいて、次にどのゴルーチンが実行されるようにスケジュールされているかを評価します。
  • 次にスケジュールされた goroutine が実行を再開します。

協調的なマルチタスクは、runtime.Gosched() などのメカニズムやチャネルなどの同時実行プリミティブを使用して制御を明示的に譲り渡すゴルーチンに依存します。対照的に、最新のオペレーティング システムで採用されているプリエンプティブ マルチタスクでは、ゴルーチンが関与することなく、スレッド間で実行コンテキストを透過的に切り替えます。

GOMAXPROCS と実行

GOMAXPROCS 環境変数Go ランタイムが goroutine の実行に使用できる OS スレッドの最大数を制御します。 GOMAXPROCS が 0 (デフォルト) または 1 に設定されている場合、ランタイムは単一のスレッドを使用します。このシナリオでは、ゴルーチンが連携して CPU 時間を共有するために runtime.Gosched() が不可欠になります。

GOMAXPROCS が 1 より大きい値に設定されている場合、ランタイムは複数の OS スレッドを作成できます。この場合、ゴルーチンは異なるスレッドで同時に実行できるため、明示的に譲歩する必要性が減ります。その結果、runtime.Gosched() が実行に与える影響は少なくなる可能性があります。

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

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