外观
goroutine 与 GMP 调度
- 状态:未准备
- 适用方向:Go 全栈 / Go 后端
- 最近复习:待填写
- 下次复习:待安排
一句话回答
goroutine 是运行时管理的并发执行单元;G 表示 goroutine、M 表示系统线程、P 表示执行 Go 代码所需的调度资源,把许多 G 调度到多个 M 上。
原理解释
并发是组织多个任务,并行是同时执行。goroutine 创建和栈管理通常比每个请求新建系统线程轻,但不是零成本,不能无限开。
M 执行普通 Go 代码需要 P,P 数量受 GOMAXPROCS 控制;它不是线程总数上限。运行时有本地与全局队列、工作窃取和抢占机制,细节随版本变化。
可轮询网络 IO 等待时通常挂起 G,就绪后再调度;阻塞系统调用可能占住 M,运行时可让其他 M 接手 P。不能说所有阻塞都不占线程。
time.Sleep 不是同步。启动次序不等于完成次序。Go 1.22 起使用新循环语义的代码中,for ... := 每轮创建独立变量;旧语言版本或复用外部变量的 = 写法仍需单独分析。
场景与边界
IO 并发覆盖等待,CPU 密集任务受核数限制。负载增长先限制在途任务数,再设计排队、拒绝与超时,避免堆积 goroutine 和内存。
项目中的应用
结合 SimulSpeak 模型与配音协调,解释并发为何不保证句序,以及为什么需要取消和容量上限。
常见追问
- GOMAXPROCS 等于核数吗? 默认行为受版本、环境和容器配额支持影响,检查实际值。
- goroutine 会自行消失吗? 函数返回才退出,永久等待可能泄漏。
- 加 go 就更快吗? 小任务调度和同步成本可能超过收益。