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

欢迎!请参阅关于页面以了解更多关于这是如何工作的信息。

0
Clojure
编辑

我认为我发现了 core.async 测试中的一个错误,以下 mult 测试似乎纯属巧合

;; ASYNC-127 
(let [ch (to-chan! [1 2 3])
      m (mult ch)
      t-1 (chan)
      t-2 (chan)
      t-3 (chan)]
  (tap m t-1)
  (tap m t-2)
  (tap m t-3)
  (close! t-3)
  (is (= 1 (<!! t-1)))
  (is (= nil (a/poll! t-1))) ;; t-2 hasn't taken yet
  (is (= 1 (<!! t-2)))
  (is (= 2 (<!! t-1))) ;; now available
  (is (= nil (a/poll! t-1)))))

core.async/mult 的文档字符串声明:如果没有偷听,则接收到的项将被丢弃。根据这个声明,通过 to-chan! 放置的 3 个项应该被丢弃,因为当 mult 创建时,它会开始在没有偷听的情况下消耗它们。

这有意义吗?我遗漏了什么吗?

编辑:我发现这个问题https://clojure.atlassian.net/browse/ASYNC-246,这似乎与此相关,在这种情况下可能是因为项被正确丢弃,然后 (<!! t-1) 挂起。

1 答案

0

选择
 
最佳答案

mult 在内部启动一个 go 块。启动的 go 块与绑定中的 taps 之间没有 happens-before 关系。taps 在 mult 开始分配 vals 之前发生是一个完美的正常顺序。

此次测试依赖于可能意外发生的一种排序。

你说得对,我表达的方式确实不正确:"... 应该被删除 items ... " 更准确的方式应该是 "可能被删除",因为作为异步操作,无论是被丢弃还是被触碰都是正常的。测试似乎不可靠,因为可能会在任何不同的排序发生时失败,也许在不同的设置中(可能在https://clojure.atlassian.net/browse/ASYNC-246中发生)。
...