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

时间:2014-05-23 15:47:40

标签: clojure clojurescript core.async

在下面的示例中,我可以看到,已发布的消息到达订阅的频道,但是,它们是在订阅之前发布的。

(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)))

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

  

没有匹配的潜艇时收到的物品会被丢弃。

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

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

1 个答案:

答案 0 :(得分:2)

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

尝试在遗嘱之前加(Thread/sleep [some value]),看看会发生什么。