外观
如何理解Go Context、Channel 与 goroutine 生命周期?
标准回答
goroutine 轻量但不是免费资源,阻塞在 Channel、网络或锁上的任务仍可能长期占用内存。创建任务时应明确谁负责等待和取消,Context 用于传播截止时间与取消信号,但被调用逻辑必须主动遵守。
发送到无人接收的无缓冲通道会阻塞,接收也可能永久等待。可以使用 select 处理取消、有界缓冲容纳有限结果,并由明确所有者关闭通道。关闭不是广播“无需关心后续发送”,向已关闭通道发送仍会失败。
共享 map 和可变对象需要同步或限制所有权。不要为每个候选、每个请求无限创建子任务,应使用并发上限和预算。在 EachOf 双路召回中,正确目标是请求结束后分支有退出路径,取消不会丢失必要提交状态。
追问与回答
Context 取消会强杀 goroutine 吗
不会,执行逻辑需要检查 Done 或调用支持 Context 的 I/O。纯 CPU 循环也要设置检查点。
为什么不能随处 defer close(channel)
多个参与者可能竞争关闭或仍在发送;关闭权应属于知道不会再发送的所有者,接收方通常不负责关闭生产者通道。
易混淆点
- 使用 goroutine 就认为工作会自动并行且自动释放。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q189