我认为我在core.async测试中找到了一个bug,以下的多通道测试似乎纯粹是巧合
;; 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个项目应该被丢弃,因为当多通道被创建时,它会开始消费它们,而此时还没有在多通道上执行操作。
这合理吗?我遗漏了什么吗?
编辑:我找到了这个相关问题https://clojure.atlassian.net/browse/ASYNC-246,似乎与这个问题相关,在这种情况下,可能是由于在丢弃项之后挂起(<!! t-1)
而导致的挂起。