if mp.spinning || 2*sched.nmspinning.Load() < gomaxprocs-sched.npidle.Load() {
if !mp.spinning {
mp.becomeSpinning()
}
gp, inheritTime, _, _, _ := stealWork(now)
if gp != nil {
return gp, inheritTime, false
}
}
return nil, false, false
}
复制代码
五、协作式调度
除了抢占式调度,Go 还支持协作式调度。Goroutine 可以通过调用runtime.Gosched() 函数主动让出 CPU 的实行权。
func main() {
go func() {
for i := 0; i < 10; i++ {
fmt.Println("Goroutine 1")
runtime.Gosched()
}
}()
for i := 0; i < 10; i++ {
fmt.Println("Goroutine 2")
}
}
复制代码
六、总结
Go 语言的 Goroutine 调度机制通过 GMP 模子和 Work Stealing 算法实现了高效的并发实行。抢占式调度和协作式调度策略确保了 Goroutine 的公平实行,而 Work Stealing 算法则进一步提高了多核处理器上的负载均衡。通过这些机制,Go 运行时可以或许高效地利用体系资源,实现高性能的并发编程。