1 回答
TA贡献1893条经验 获得超10个赞
从上下文中。WithCancel 文档
当调用返回的 cancel 函数或父上下文的 Done 通道时(以先发生者为准),返回上下文的 Done 通道将关闭。
从上下文中。上下文文档
Done 返回一个通道,当代表此上下文完成的工作应被取消时,该通道已关闭。
取消上下文不应意味着“销毁此上下文”或“使此上下文不再可用”。这纯粹是向上下文的用户发出信号,表明工作应该被取消。此信号不是魔术,必须明确检查。
请考虑以下情况:
select {
case <-ctx.Done():
return
default:
value := ctx.Value("something")
doSomething(value)
}
现在想象一下,上下文按照您的想象工作,在取消时,值不再可检索。这种情况现在可能是可能的:
select {
case <-ctx.Done():
return
default:
// OH NO! Even though we just checked and it was ok,
// some other goroutine called cancel() right at this moment!
value := ctx.Value("something")
// Now "value" is going to be invalid.
doSomething(value)
}
现有的上下文模型很有帮助,因为它允许工作例程仅在最安全或最方便的特定检查点检查上下文状态,而在其他情况下不必担心它。
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报
