在下面的示例中,我可以看到,已发布的消息到达订阅的频道,但是,它们是在订阅之前发布的。
(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我看到类似的行为
答案 0 :(得分:2)
您不知道在订阅之前发布了消息。因为go是异步的,所以订阅很可能在第一条消息被放入通道之前发生。这确实是一场竞争。
尝试在遗嘱之前加(Thread/sleep [some value])
,看看会发生什么。