为什么core.async去块会返回一个频道?

时间:2016-03-26 15:06:38

标签: clojure core.async

我理解'go blocks'(无论是go还是go-loop还是可能是其他结构)都会返回一个频道。但是我从来没有理解这个频道的目的。我想知道如何使用它。也许我在不需要时创建额外的频道。

1 个答案:

答案 0 :(得分:3)

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

这是一个简单的示例(并不意味着用于计算总和的任何生产代码),它实现了双向并行化:

(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 - 块的结果。

相关问题