管道的文档说:“如果在到(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 个在 out go,1 个在结果通道中,1 个在处理 go 中)
*建议:* 一种选择是更改文档字符串,不再保证这种行为。另一种选择是让关闭操作反向流入管道结构,关闭一切。