【问题标题】:messages publish before subscribe in core.async在 core.async 中订阅之前发布消息
【发布时间】:2014-05-23 15:47:40
【问题描述】:

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

(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 我看到类似的行为

【问题讨论】:

    标签: clojure clojurescript core.async


    【解决方案1】:

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

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

    【讨论】:

    • 你还是不知道语句的执行顺序。请参阅此帖子以进行澄清。 stackoverflow.com/questions/21463377/…
    • 现在我稍微更改了代码并将所有内容放在一个大文件中(go ..)。同样的结果。我的理解是(go ..)里面的所有东西都是按顺序计算的。
    • 不太清楚您所说的“一举两得”是什么意思。你可以发布你的代码吗,也许在一个单独的问题中?
    • 在这里 - gist.github.com/aav/2d8117a70574db9c3729 - 我假设里面的所有东西 (go ...) 都是按顺序计算的。
    • 有趣的是,这段代码(来自要点)在 Clojure 和 ClojureScript 中的行为不同。在 Clojure 中它按预期工作,而在 ClojureScript 中仍然将消息传递到订阅频道。
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2016-07-03
    • 2016-11-25
    • 1970-01-01
    • 2021-02-27
    • 2015-06-30
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多