2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面,了解更多关于它是如何工作的一些信息。

0
core.async
文档中关于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操作沿管道结构回传,关闭整个系统。

3 答案

0

评论由:xiongtx 发表

{quote}
一种选择是更改文档字符串并不要保证这种行为。
{quote}

预期我们不会在未消费输出时无限处理输入,这在to通道关闭的情况下肯定会发生。

0

评论者:alexmiller

天翔:我倾向于同意你的观点,只是详细列出了选项。:)

0
参考:[https://clojure.atlassian.net/browse/ASYNC-217](https://clojure.atlassian.net/browse/ASYNC-217)(由alexmiller报告)
...