一、GPM模型概述
Go语言的并发模型是其最强大的特性之一,而这一切的核心就是GPM调度模型。让我们用一个生活中的例子来理解:
想象你经营着一家快递公司:
- G(Goroutine):就像一个个待配送的包裹
- P(Processor):就像是你公司的配送站,负责组织配送工作
- M(Machine):就像是快递小哥,真正执行配送任务
在Go 新版本中,这个模型变得更加高效智能。我们先看一个简单例子:
package mainimport ("fmt""runtime""time"
)func main() {// 设置使用所有CPU核心runtime.GOMAXPROCS(runtime.NumCPU())for i := 0; i < 10; i++ {go func(id int) {fmt.Printf("Goroutine %d running on P/M\n", id)}(i)}time.Sleep(time.Second) // 等待所有goroutine完成
}
二、GPM三大组件详解
1. G (Goroutine)
Goroutine是Go的轻量级线程,每个Goroutine初始只有2KB栈空间(可以动态扩容)。
type g struct {stack stack // 栈信息m *m // 当前绑定的msched gobuf // 保存执行上下文atomicstatus uint32 // 状态: running, runnable等// ... 其他字段
}
状态转换示例