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

欢迎!请查看 关于 页以获取有关此操作的更多信息。

0 投票
core.async
流水线的文档说明“如果关闭接收端,将停止从接收端消费。”然而,当前读取结果并将其放入接收端的 go 块执行一个 >! 操作,并检查返回值以停止尝试输出当前输出值,但随后继续尝试处理下一个输出。因此,如果接收端关闭,流水线将继续读取、处理和尝试在接收端输出值而不停止。

另外,即使它停止了,也已经有了一些值被从接收端读取(可能有一个正在输出 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 投票

评论者:alexmiller

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

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