Go コルーチンのスケジューリングには 3 つの戦略があります: G0 と G1: プリエンプティブ スケジューリング、優先度 G1 > G0。 G0 および G1: プリエンプティブ スケジューリング、優先度 G1 > G0。非プリエンプティブ スケジューリング: コルーチンは、CPU 実行権を積極的に放棄するまで実行されます。
コルーチンは、Go の軽量の同時実行メカニズムです。スケジューリング ポリシーは、コルーチンの実行をスケジュールする方法を決定します。 Go は 3 つのスケジューリング戦略を提供します:
G0 と G1 は両方ともプリエンプティブ スケジューリングです。これは、実行中のコルーチンが、より優先度の高いコルーチンによってプリエンプトされる可能性があることを意味します。
G1 は G0 よりも高い優先度を持っています。両方のコルーチンが実行可能な状態にある場合、G1 コルーチンが最初に実行されます。
ノンプリエンプティブ スケジューリングは非プリエンプティブです。これは、実行中のコルーチンをプリエンプトできないことを意味します。 CPU の実行が自発的に放棄されるまで実行され続けます。
package main import ( "fmt" "runtime" "sync" ) func main() { var wg sync.WaitGroup defer wg.Wait() for i := 0; i < 2; i++ { wg.Add(1) go func(i int) { defer wg.Done() fmt.Printf("协程 %d 在 G0 调度器上执行\n", i) runtime.Gosched() }(i) } }
package main import ( "fmt" "runtime" "sync" ) func main() { runtime.LockOSThread() for i := 0; i < 2; i++ { go func(i int) { fmt.Printf("协程 %d 使用非抢占式调度\n", i) }(i) } }
以上がGolang コルーチンのスケジューリング戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。