一、GPM模型概述
Go语言的并发模型是其最强大的特性之一,而这一切的核心就是GPM调度模型。让我们用一个生活中的例子来理解:
想象你经营着一家快递公司:
- G(Goroutine):就像一个个待配送的包裹
- P(Processor):就像是你公司的配送站,负责组织配送工作
- M(Machine):就像是快递小哥,真正执行配送任务
在Go 新版本中,这个模型变得更加高效智能。我们先看一个简单例子:
package main
import (
"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 // 当前绑定的m
sched gobuf // 保存执行上下文
atomicstatus uint32 // 状态: running, runnable等
// ... 其他字段
}
状态转换示例