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

标签 clojure channel core.async

我有一个充当发布商的 channel :

(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即使订阅者尚未订阅

)

最佳答案

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

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

另请参阅relevant code section .

关于clojure - 使用 core.async pub/sub 时如何避免丢失项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707396/

相关文章:

Clojure Luminus Migrations - 每个迁移文件只有一张表

macos - Clojure 仅依赖于 Java 1.5?

clojure - 以多种语法引用形式重用 auto-gensym 的宏

go - 带多余 channel 的 gorilla websocket示例?

go - 我收到的以下 go 代码有什么问题 'all goroutines are asleep - deadlock!'

unit-testing - 如何在 Clojure 中对副作用函数进行单元测试?

clojure - 在 clojure 中定期运行任务的最简单方法是什么

用于 uberjars/.classes 的 Clojure 热代码交换

android - 如何以16位格式分别在左右声道上播放两个正弦波?

clojure - 即使它是 alpha,在生产中使用 clojure core.async 是否安全?