为什么 core.async 会阻止 return 一个频道?

Why do core.async go blocks return a channel?

我了解 'go blocks'(无论是 go 还是 go-loop 或其他结构)return 是一个频道。但是我一直不明白这个频道的目的。我想知道如何使用它。也许我在不需要的时候创建了额外的频道。

我使用 go 块的 return 通道作为句柄,我可以将其传递给另一个想要与 [= 完成同步的函数(不仅仅是宏) 11=]-块。或者,我可以在通道上执行阻塞读取,以保证 go-block 的执行何时完成。

这是一个进行双向并行化的简单示例(不打算用于任何生产代码来计算总和):

(defn par-sum [coll]
  (let [half-n (/ (count coll) 2)
        [left right] (split-at half-n coll)
        left-sum-chan (async/go (core/reduce + 0 left))
        right-sum (core/reduce + 0 right)
        left-sum (async/<!! left-sum-chan)]
    (+ left-sum right-sum)))

在这个例子中,我们并行计算左右和。 由于我们需要左和来计算总和,因此我们必须等待结果并检索 go-块的结果。