Go 并发编程 专栏导览
专栏定位
本专栏聚焦 Go 并发编程的核心机制与实战模式——Go 的并发模型基于 CSP(Communicating Sequential Processes),以 Goroutine + Channel 为核心原语,配合 GMP 调度器实现了轻量级的用户态线程。本专栏从 GMP 调度器的设计出发,深入 Channel 的底层结构、sync 包的锁和同步原语、Context 的取消传播,最终落地到常见的并发模式和生产实践。
目标读者
- 日常写 Go 并发代码但希望理解 Goroutine 调度和 Channel 底层机制的开发者
- 需要排查 Goroutine 泄漏、死锁、数据竞争等并发 Bug 的工程师
- 对用户态线程调度和 CSP 并发模型感兴趣的技术爱好者
专栏目录
| 序号 | 标题 | 核心内容 |
|---|---|---|
| 01 | 01 Goroutine 与 GMP 调度器 | Goroutine 的轻量级(2KB 初始栈 vs 线程的 MB 级栈)、GMP 模型(G/M/P 三者关系)、调度循环(schedule → execute → goexit)、抢占式调度(Go 1.14 信号抢占)、Goroutine 栈的动态伸缩 |
| 02 | 02 Channel 的底层结构与阻塞唤醒机制 | hchan 结构体(buf 环形缓冲区/sendq/recvq 等待队列)、有缓冲 vs 无缓冲 Channel 的语义差异、发送/接收的加锁与 Goroutine 挂起/唤醒(gopark/goready)、select 的随机选择实现、Channel 关闭的广播语义 |
| 03 | 03 sync 包——Mutex、RWMutex 与 WaitGroup 的实现 | Mutex 的两种模式(正常模式 vs 饥饿模式)、自旋与信号量的切换策略、RWMutex 的读写分离(readerCount 的负值技巧)、WaitGroup 的计数器与信号量、sync.Once 的双重检查 |
| 04 | 04 sync.Map、sync.Pool 与原子操作 | sync.Map 的 read/dirty 双 map 设计(读多写少优化)、sync.Pool 的 P 本地缓存与 victim 机制、atomic 包的 CAS/Load/Store、atomic.Value 的无锁读写 |
| 05 | 05 Context 的设计与取消传播机制 | Context 接口的四个方法(Deadline/Done/Err/Value)、WithCancel/WithTimeout/WithDeadline 的实现、取消信号的树形传播、Context 的最佳实践(不要存储在 struct 中/作为第一个参数传递)、context.Value 的滥用与替代方案 |
| 06 | 06 Go 并发模式——Pipeline、Fan-out Fan-in 与 Worker Pool | Pipeline 模式(Channel 串联多个处理阶段)、Fan-out/Fan-in 的并行分发与汇聚、Worker Pool 的 Goroutine 复用、errgroup 的错误传播、rate.Limiter 的令牌桶限流 |
| 07 | 07 并发陷阱与调试——Goroutine 泄漏、死锁与 Race Detector | Goroutine 泄漏的常见原因(Channel 未关闭/Context 未取消/阻塞 IO)、pprof 排查 Goroutine 堆栈、死锁的四个条件与 Go 的死锁检测、Race Detector(-race 标志)的实现原理(ThreadSanitizer)、实战排查案例 |
| 08 | 08 Go 网络编程——netpoller 与 Goroutine-per-Connection | Go 的 net 包如何隐藏非阻塞 IO、netpoller 的 epoll/kqueue 封装、Goroutine-per-Connection 模型为何在 Go 中可行、与 Netty Reactor 模型的对比、HTTP/2 和 gRPC 的并发处理 |
推荐阅读路径
核心原理路径:01 → 02 → 03 → 05
并发模式路径:06 → 04
调试实战路径:07 → 08
前置知识
- Go 基础语法(goroutine/channel/select 的基本使用)
- 建议先阅读 Go语言核心 专栏了解 Go 的类型系统和内存分配器
- 建议了解 Java 并发编程 专栏中的线程模型和锁机制(形成对照)