sle*_*ica 3 concurrency channel go
我不明白Done()
通道如何context.Context
按预期工作。模块文档(和使用它的源代码)依赖于这种模式:
select {
case <-ctx.Done():
return ctx.Err()
case results <- result:
}
Run Code Online (Sandbox Code Playgroud)
Done()
如果Context
取消或超时,则关闭通道返回,并且Err()
变量保存原因。
关于这种方法,我有两个问题:
select
通道关闭时的行为是什么?案件何时以及为何进入?没有分配的事实是否具有相关性?
根据语言参考:
如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。
如果选择是随机的,那么该模式如何保证在Context
取消时我不会将结果发送到管道中?我会理解是否按申报顺序评估案例(并选择了封闭渠道案例)。
如果我在这里完全偏离轨道,请从更好的角度向我解释这一点。
这个案例:
case <-ctx.Done():
Run Code Online (Sandbox Code Playgroud)
有通讯操作:
<-ctx.Done()
Run Code Online (Sandbox Code Playgroud)
这是来自频道的接收。规格:接收操作员:
因此,当返回的通道ctx.Done()
关闭时,可以立即进行接收。因此控制流可以进入这种情况。
如果上下文被取消时另一个case
( results <- result
) 也可以继续,则随机选择一个(伪),无法保证它会是哪一个。
如果你不想上发送值results
上下文是否已经取消,检查ctx.Done()
通道前将select
与另一非阻塞select
:
select {
case <-ctx.Done():
return ctx.Err()
default:
}
select {
case <-ctx.Done():
return ctx.Err()
case results <- result:
}
Run Code Online (Sandbox Code Playgroud)
请注意,您必须default
向第一个选择添加一个分支,否则它将阻塞,直到上下文被取消。如果存在default
分支并且上下文尚未取消,default
则选择分支,因此控制流可以转到第二个select
。
查看相关问题:
归档时间: |
|
查看次数: |
261 次 |
最近记录: |