2024 年 Clojure 调查问卷中分享您的看法!

欢迎!请参阅 关于 页面以了解此部分的更多信息。

0 投票
core.async
流水线的文档说明“如果'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块中)


*建议:* 一种选择是更改文档字符串,并不要承诺此行为。另一种选择是使关闭操作反向流动到流水线结构中,关闭一切。

3 答案

0 投票

评论由:xiongtx 添加

{quote}
一种选择是更改文档字符串并不要承诺此行为。
{quote}

期望的是,当我们不消费输出时,我们不会无限制地处理输入,这在'to'渠道关闭时的确如此。

0 投票

评论人:alexmiller

天翔:我倾向于同意你的看法,只是在列出选项时力求全面。:)

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