Go Goroutine 调度器原理与代码实践
<p>## Go Goroutine 调度器原理与代码实践</p> <p>Go 的并发由 M(Machine)、P(Processor)、G(Goroutine) 三要素组成。调度器采用 G-M-P 模型,M 代表线程,P 是逻辑处理器,G 是协程。调度器将 G 绑定到 P,再由 M 执行,实现高效调度。</p> <p>核心点:</p>
- 每个 P 维护一个本地 G 队列,减少全局竞争。
- 工作窃取(Work Stealing)机制:当某个 P 队列为空时,会从其他 P 窃取一半 G。
- Go 默认启动时创建 GOMAXPROCS 数量的 P,等同 CPU 核数。
package main
import (
    "fmt"
    "runtime"
    "time"
)
func worker(id int) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Worker %d doing task %d\n", id, i)
        time.Sleep(100 * time.Millisecond)
    }
}
func main() {
    runtime.GOMAXPROCS(2) // 设置 P 数量
    for i := 0; i < 4; i++ {
        go worker(i)
    }
    time.Sleep(time.Second)
}
</pre>
<p>多个 Goroutine 会被调度到不同的 P 中运行,实现并发任务处理。</p> <hr />
评论 0