01
Go Channel 的 Panic 防御与并发拓扑设计
线上 Fatal Crash 基本集中于 send on closed channel 与 close of closed channel 两类 Panic。本文拆解接收端擅自关闭与多生产者各自关闭两大诱因,给出 WaitGroup 聚合单点关闭、基于 context.Context 解耦生命周期两种拓扑模式,并说明未关闭 Channel 的内存回收保障。
WRITING / ENGINEERING NOTES
记录 Go 后端、React/Next.js 与全栈项目中的架构决策、实现细节与工程复盘。
主题
归档
线上 Fatal Crash 基本集中于 send on closed channel 与 close of closed channel 两类 Panic。本文拆解接收端擅自关闭与多生产者各自关闭两大诱因,给出 WaitGroup 聚合单点关闭、基于 context.Context 解耦生命周期两种拓扑模式,并说明未关闭 Channel 的内存回收保障。
把 Channel 的 3 种生命周期状态(nil / Active / Closed)与 3 种基本操作(接收 / 发送 / 关闭)做正交分解,推导出完整行为矩阵,并给出 Closed 状态误写误关的防崩溃设计规范,以及用 nil 实现 select 分支动态禁用的标准范式。
一次 OOM 故障复盘:消费方超时退出后,无缓冲 channel 的发送方永久阻塞,导致 Goroutine 计数单调递增直至内存耗尽。文中给出容量为 1 的缓冲通道与 context.Context 主动取消两种修复方案,并总结杜绝孤儿协程的工程化规范。