流水线的文档说明“如果'to'渠道关闭,将停止从'from'渠道消费。”然而,当前正在读取结果并将数据放入'to'渠道的go块执行>!并检查返回值以停止尝试输出当前输出值,但随后它仍然尝试处理下一个输出值。因此,如果'to'渠道关闭,流水线将继续读取、处理并尝试向'to'渠道输出值而不停止。
此外,即使它确实停止了,也可能已经从'from'渠道读取了一些数值(可能有一个正在输出的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块中)
*建议:* 一种选择是更改文档字符串,并不要承诺此行为。另一种选择是使关闭操作反向流动到流水线结构中,关闭一切。