以下是代码段:
for !done && outstanding > 0 {
select {
case signals := <- input:
outstanding++
go func() { results <- FFT(signals) }()
case res <- results:
outstanding--
output <- results
case <- ctx.Done():
done = true
}
}
In this video Richard Fliam说:
在此代码段中,我们将一些工作转移到多个内核进行FFT。取消后,收集所有未完成的结果并在之前发送函数返回。如果我们在这种情况下没有收集结果,我们就会发生内存泄漏。你可以看到这个,因为我没有选择那个go func中的Done上下文。
但是当有一些未完成的结果(未完成的变量大于零)并且取消操作时,则将done变量设置为true,然后for循环的条件将评估为false,因此未完成的结果将是不被收集。
为什么他说在函数返回之前收集了优秀的结果?
我是新手。也许我不了解一些基本概念。
更新
如果for循环的条件如下,IMO将始终收集未完成的结果:
// logical OR instead of AND
for !done || outstanding > 0 { ... }
因为当取消操作并且仍有一些未完成的结果时,for循环的条件将评估为true。如果所有未完成的结果到达,则for循环将结束。
答案 0 :(得分:2)
此行ItemPage
output <- results
这部分片段是错误的,因为那时双重收到了香奈儿。
必须:
case res <- results:
outstanding--
output <- results