Skip to content
阅读进度

如何理解Go Context、Channel 与 goroutine 生命周期? ​

返回 架构与 SDK 目录

标准回答 ​

goroutine 轻量但不是免费资源,阻塞在 Channel、网络或锁上的任务仍可能长期占用内存。创建任务时应明确谁负责等待和取消,Context 用于传播截止时间与取消信号,但被调用逻辑必须主动遵守。

发送到无人接收的无缓冲通道会阻塞,接收也可能永久等待。可以使用 select 处理取消、有界缓冲容纳有限结果,并由明确所有者关闭通道。关闭不是广播“无需关心后续发送”,向已关闭通道发送仍会失败。

共享 map 和可变对象需要同步或限制所有权。不要为每个候选、每个请求无限创建子任务,应使用并发上限和预算。在 EachOf 双路召回中,正确目标是请求结束后分支有退出路径,取消不会丢失必要提交状态。

追问与回答 ​

Context 取消会强杀 goroutine 吗 ​

不会,执行逻辑需要检查 Done 或调用支持 Context 的 I/O。纯 CPU 循环也要设置检查点。

为什么不能随处 defer close(channel) ​

多个参与者可能竞争关闭或仍在发送;关闭权应属于知道不会再发送的所有者,接收方通常不负责关闭生产者通道。

易混淆点 ​

  • 使用 goroutine 就认为工作会自动并行且自动释放。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。