去选择频道并收集结果

时间:2015-08-14 21:00:38

标签: go

以下是代码段:

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循环将结束。

1 个答案:

答案 0 :(得分:2)

此行ItemPage

收集了所有结果
output <- results

这部分片段是错误的,因为那时双重收到了香奈儿。

必须:

case res <- results:
    outstanding--
    output <- results