Go 语言并发模型深度解析:GMP 与实战模式

Go 语言并发模型深度解析:GMP 与实战模式

一、Go 并发哲学

不要通过共享内存来通信,而应通过通信来共享内存。Go 通过 CSP 模型实现并发。

二、GMP 调度器

组件

  • G(Goroutine):轻量级执行体,栈 2KB 动态增长
  • M(Machine):OS 线程
  • P(Processor):逻辑处理器,管理 G 队列

调度策略

每个 P 维护本地 G 队列,工作窃取机制让空闲 P 从其他 P 偷 G。

为什么快?

goroutine 创建仅 4KB(线程 1MB+),上下文切换仅 3 条指令。

三、并发模式

Pipeline 模式:通过 channel 连接多个处理阶段。

Fan-out/Fan-in:多个 goroutine 读取和合并 channel。

Select 多路复用:处理多 channel 和超时。

四、控制工具

sync.WaitGroup、sync.Mutex、sync.RWMutex、sync.Once、errgroup、semaphore。

五、常见陷阱

  • goroutine 泄漏:channel 未关闭
  • 并发写 map:需 sync.Map
  • channel 死锁:无缓冲 channel 同步问题
  • panic 传播:goroutine panic 崩溃整个程序

六、优化建议

合理设置 GOMAXPROCS,使用 sync.Pool 减少 GC,用 pprof 分析瓶颈。


本文为个人学习整理,欢迎交流讨论。

相关推荐
凤山老林6 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
Thinker QAQ7 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
朱涛的自习室7 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
woniu_maggie10 小时前
SAP MDG主数据治理实战:从架构原理到项目实施全解析
后端
xiaoqiMikko10 小时前
Redis 实战(一):内存满了 —— 拒写、淘汰、被系统杀掉,以及删了 key 内存为什么不降(6.2.4 实测)
redis·后端
工程师小爱10 小时前
电芯尺寸合格,不等于电池包尺寸合格
后端
geovindu10 小时前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
闲云lazycloud10 小时前
第 1 课:Harness 与 Agent 运行时
人工智能·后端
熊哈哈O_o10 小时前
260+异构同步链路:DDL语法自动翻译在大规模数据同步中的实现原理
后端