go 协程调度有三种策略:g0 和 g1:抢占式调度,优先级 g1 > g0。g0 和 g1:抢占式调度,优先级 g1 > g0。非抢占式调度:协程运行至主动让出 cpu 执行权。
Golang 协程的调度策略
协程是 Go 中轻量级的并发机制。调度策略决定了如何调度协程执行。Go 提供了三种调度策略:
- G0
- G1
- 非抢占式调度
G0 和 G1
G0 和 G1 都是抢占式调度。这意味着正在运行的协程可以被更高优先级的协程抢占。
G1 的优先级高于 G0。如果两个协程都在可运行状态,则 G1 协程将先执行。
非抢占式调度
非抢占式调度是非抢占式的。这意味着正在运行的协程不能被抢占。它将继续运行,直到主动让出 CPU 执行权。
实战案例
使用 G0
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协程的调度策略的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!