【问题标题】:How to avoid dropping items when using core.async pub/sub?使用 core.async pub/sub 时如何避免丢弃项目?
【发布时间】:2015-04-26 18:15:27
【问题描述】:

我有一个频道作为发布者:

(def publisher (async/chan))
(def publication (async/pub publisher :topic))

由于sub/pub的性质,当我这样做时:

(async/put! publisher {:topic :foo})

消息被发布消费,由于没有订阅者,它会被丢弃。

如果我尝试订阅:foo 主题:

(def reader (async/chan))
(async/sub publication :foo reader)
(async/go (println "got val " (async/<! reader)))

我不会看到任何打印的内容。但是,如果我在发布者中放置更多项目:

(async/put! c1 {:topic :foo :msg "after"})
==> got val {:topic :foo :msg "after"}

有没有办法不丢失发布者生成的最后一个n 项目即使订阅者尚未订阅

【问题讨论】:

    标签: clojure channels core.async


    【解决方案1】:

    pub 接受给定主题的buf-fn 函数。这个函数应该返回一个缓冲区。如dropping-buffersliding-buffer。因此,如果您希望您的 :foo 主题被缓冲:

    (pub pub-ch :topic #(if (= % :foo) (sliding-buffer 10) nil))
    

    另见relevant code section

    【讨论】:

      【解决方案2】:

      documentation 是明确的:

      没有匹配的子项时收到的项目被丢弃

      【讨论】:

      • 是的,我知道...我只是想知道是否有办法解决这个问题。
      • 您可以在sub 中传递一个buf-fn,但它似乎仅在调用sub 时使用。所以看起来它不适合您的用例。
      猜你喜欢
      • 1970-01-01
      • 2019-08-20
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 2021-04-17
      • 2017-06-18
      • 1970-01-01
      相关资源
      最近更新 更多