文档中关于pipeline的说明是:“如果to通道关闭,将停止从from通道消费。”然而,当前读取结果并将其放入to通道的go块执行>!操作,并检查返回值以停止尝试输出当前值,但随后它仍然尝试处理下一个输出。因此,如果to通道关闭,管道将继续读取、处理并尝试向to通道输出值,而不会停止。
此外,即使它停止了对输出,也可能已经从from通道读取了一些值(1个可能在输出go块中处理中,N个可能在结果通道中,N个可能在过程中的go块的飞行中)。
(require '[clojure.core.async :as a])
(let [from (a/to-chan (range 100))
to (a/chan 1)]
(a/pipeline 1 to (map #(doto % println)) from)
(a/close! to))
;; 打印0...99
;; 期望:应该打印不超过4个项目(1个在to中,1个在输出go中,1个在结果通道中,1个在处理中的go中)
【建议】一个选择是更改文档字符串并不要保证这种行为。另一个选择是使得close操作沿管道结构回传,关闭整个系统。