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