使用core.async pub / sub时如何避免丢弃项目?

时间:2015-02-24 22:13:25

标签: clojure channels core.async

我有一个频道充当发布商:

(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项?

2 个答案:

答案 0 :(得分:3)

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

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

另见relevant code section

答案 1 :(得分:0)

documentation是明确的:

  

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