我认为我在 core.async 测试中找到一个 bug,以下 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 的文档字符串说明:在没有 taps 的情况下接收到的项会被丢弃。根据这句话,通过 to-chan! 放入的 3 项应该被丢弃,因为当 mult 创建时,它会开始在没有 taps 的 mult 上消费它们。
这有道理吗?我忽略了什么吗?
编辑:我发现这个问题 https://clojure.atlassian.net/browse/ASYNC-246,似乎与之相关,在这种情况下,可能是因为项被正确丢弃后,(<!! t-1)
挂起了。