【发布时间】:2021-03-18 05:11:20
【问题描述】:
我不明白context.Context 中的Done() 频道如何按预期工作。模块文档(以及使用它的源代码)依赖于这种模式:
select {
case <-ctx.Done():
return ctx.Err()
case results <- result:
}
如果Context被取消或超时,Done()的通道返回关闭,Err()变量保存原因。
我对这种方法有两个问题:
-
当频道关闭时
select的行为是什么?何时以及为何进入案件?没有分配的事实是否具有相关性? -
根据语言参考:
如果一个或多个通信可以继续,则通过统一的伪随机选择选择一个可以继续的通信。
如果选择是随机的,那么当
Context被取消时,该模式如何保证我不会将结果发送到管道中?如果这些案例是按申报顺序评估的(并且选择了封闭渠道案例),我会理解。
如果我在这里完全偏离轨道,请从更好的角度向我解释。
【问题讨论】:
-
“该模式如何保证我不会将结果发送到管道中?”,没有任何模式可以,这就是并发的本质。
-
您可以对“该模式如何保证我不会通过管道发送结果”有一些保证:这取决于您如何创建
result。如果result没有缓冲,则只有在某些接收操作解决后,发送操作才会继续。如果result有一个缓冲区,它可能包含一个(或多个)值;但是,如果在您的select语句中执行的分支是<-ctx.Done() :之一,您仍然可以保证不会从result中弹出任何值。 -
除非它可能在发送之前被取消,或者在您检查缓冲通道后准备发送。截止时间总是任意的,如果您不等待响应,您只需要接受您可能会“接近”,这并不重要。
标签: go concurrency channel