我认为我发现了 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)
挂起。