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

欢迎!请查看关于页面了解更多信息。

0
core.async
管道的文档说:“如果在到(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 中)


*建议:* 一种选择是更改文档字符串,不再保证这种行为。另一种选择是让关闭操作反向流入管道结构,关闭一切。

3个答案

0

评论由:xiongtx 提出

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

我们应该期望的是,当不消费输出时不要持续处理输入,这绝对会在到(to)通道关闭时发生。

0
by

评论者:alexmiller

田翔:我倾向于同意你的观点,只是列举选项时更加细致。 :)

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