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协程的调度策略的详细内容,更多请关注编程网其它相关文章!