clojure - 为什么 `core.async/pipeline` 返回一个 channel ?

标签 clojure core.async

我刚刚注意到 pipeline家庭返回 channel它似乎完全独立于管道的目的及其相关 channel 。

请注意,在以下示例中,您可以 >! / <!来自 pipesa> / b>是分开的,它们是不相关的。

据我了解,pipeline s 应该是空操作,并返回 nil在设置副作用时 transduc来自 a>b> .

那么,我错过了什么,为什么 pipeline返回 channel ?

(def a> (chan))
(def b> (chan))
(def pipes (pipeline-blocking 4
                     b>
                     (map clojure.string/upper-case)
                     a>))
(go (>! pipes "hello world"))
(go (println "Pipes: " (<! pipes)))
(go (>! a> "apples are gooood"))
(go (println "B: " (<! b>)))

最佳答案

当没有更多要复制的元素时,您会返回一个关闭的 channel 。即在a>之后已关闭,并且其中的所有元素都已大写并放置在 b> 上.您可以 <!从生成的 channel 中找出流水线操作何时完成,如果你关心,或者你可以扔掉 channel 。你可能不应该写信给它。

这是许多异步操作的常见模式,并且确实经常隐式发生:每个 go块返回一个 channel ,该 channel 在块完成时写入块的返回值,许多异步操作使用 go块作为它们的返回值,因此您会自动获得这个“完成工作”的 channel 。

关于clojure - 为什么 `core.async/pipeline` 返回一个 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40473827/

相关文章:

通过列表或序列上的数字索引进行 Clojure 关联解构 : Unexpected result

java - Clojure - 消耗的惰性序列元素是否保留在内存中?

clojure - 是否有(最好是 native 的)Clojure 绑定(bind)到 OrientDB,支持最新版本的二进制 API?

http - 使用带有 core.async channel 的 http-kit 长轮询

clojure - 使用 Clojure 的 core.async 使用文件内容

clojure.async : "&lt;! not in (go ...) block" error

clojure - 有位获取功能吗?

for-loop - 在 for 中实现计数器

error-handling - 使用 clojure core.async 管道处理错误

clojure - 在 clojure core.async go-loop 中工作的方式有哪些权衡?