跳到正文

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 就更快吗? 小任务调度和同步成本可能超过收益。

参考资料 ​

理解机制,讲清取舍,用复盘检验掌握。