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>

  1. 每个 P 维护一个本地 G 队列,减少全局竞争。
  2. 工作窃取(Work Stealing)机制:当某个 P 队列为空时,会从其他 P 窃取一半 G。
  3. Go 默认启动时创建 GOMAXPROCS 数量的 P,等同 CPU 核数。
<p>示例代码:</p> <pre class="codehilite">package main

import ( "fmt" "runtime" "time" )

func worker(id int) { for i := 0; i &lt; 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 &lt; 4; i++ { go worker(i) } time.Sleep(time.Second) }</pre>

<p>多个 Goroutine 会被调度到不同的 P 中运行,实现并发任务处理。</p> <hr />

评论 0