clojure - core.async 中消息在订阅之前发布

标签 clojure clojurescript core.async

在下面的示例中,我可以看到,已发布的消息到达了订阅的 channel ,尽管它们是在订阅之前发布的。

(let [in (async/chan)
      out (async/chan)
      pub (async/pub in :key)]

  (async/go
    (>! in {:id 1 :key :k1})  
    (>! in {:id 2 :key :k1})  
    (>! in {:id 3 :key :k1}))

    (async/sub pub :k1 out)

    (async/go-loop []
      (println (<! out)) 
      (recur)))

这是预期的行为吗?据我在文档中看到,它明确指出:

Items received when there are no matching subs get dropped.

我在 Clojure 和 ClojureScript 中得到相同的结果。

添加: 使用 mult/tap 我看到类似的行为

最佳答案

您不知道消息是在订阅之前发布的。因为 go 是异步的,所以订阅很可能在第一条消息放入 channel 之前发生。这确实是一种竞争条件。

尝试在订阅之前添加一个(Thread/sleep [some value]),看看会发生什么。

关于clojure - core.async 中消息在订阅之前发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23833526/

相关文章:

clojure - 使用 Clojure 的 core.async 使用文件内容

clojure - core.async和10,000个动画处理-在这种情况下,实际的好处是什么?

Clojure core.async, channel 与端口

clojure - rxjava 和 clojure 异步之谜 : futures promises and agents, 哦天哪

http - 您可以在 header 中设置发布请求的大小限制吗?

java - 生成 NTLMv2 哈希并验证

可从 ClojureScript 使用的 JavaScript GUI 库?

unit-testing - Midje Clojure 中的 JUnit AfterClass 等价物?

clojure - 如何在 Clojure 的函数/宏内的另一个命名空间中定义变量?

javascript - 在 clojurescript 中扩展 deftype 的构造函数