为什么 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
-块的结果。
我了解 '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
-块的结果。