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

欢迎!请查看关于页面,了解更多关于这个平台如何运作的信息。

0 投票
Clojure
编辑

我认为我在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)而导致的挂起。

1 个答案

0 投票

已选中
 
最佳答案

mult内部启动一个go块。这个启动的go块与在let绑定中发生的taps之间没有发生先后关系。在tabs在mult开始分配值之前发生是完全正常的排序。

这个测试依赖于可能意外发生的排序。

你说得对,我表述的方式不正确:“...项...应该被丢弃”,更正确的方式是“可能会被丢弃”,因为异步处理要么被丢弃,要么被接受,这两种行为都是正确的。无论哪种方式,测试似乎都不太可靠,因为它可能在不同的情况下失败,也许是在不同的设置中(很可能是https://clojure.atlassian.net/browse/ASYNC-246)发生的)。
...