Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 整个出版物都被封锁了_Clojure_Publish Subscribe_Clojurescript_Core.async - Fatal编程技术网

Clojure 整个出版物都被封锁了

Clojure 整个出版物都被封锁了,clojure,publish-subscribe,clojurescript,core.async,Clojure,Publish Subscribe,Clojurescript,Core.async,我将在ClojureScript应用程序中设置一个发布/订阅模型,因为我需要多个订阅者来接收放置在一个频道上的所有消息 在底部,导游说: 值得注意的是,如果发布试图传递到不接受值的频道,则整个发布将阻止: (def loser-chan (chan)) (sub our-pub :loser loser-chan) (>!! input-chan {:msg-type :loser :text "I won't be accepted"}) 小心:这将返回true且不会阻塞,因为发布正在

我将在ClojureScript应用程序中设置一个发布/订阅模型,因为我需要多个订阅者来接收放置在一个频道上的所有消息

在底部,导游说:

值得注意的是,如果发布试图传递到不接受值的频道,则整个发布将阻止:

(def loser-chan (chan))
(sub our-pub :loser loser-chan)
(>!! input-chan {:msg-type :loser :text "I won't be accepted"})
小心:这将返回true且不会阻塞,因为发布正在从输入中获取值。但在出版物内部,挂着一个围棋。这个>!!一个:loser值也不会阻塞主线程,但是下面所有的都会阻塞

这个故事的寓意是:如果你订阅了一个出版物的频道,确保它可以接受价值观!无论如何,你都应该这样做,但在处理出版物时,这一点尤其重要,因为在其他话题悬而未决之前,你可能不知道有什么地方出了问题

我不理解这一点,但我恐怕在尝试实现一个通用函数时遇到了这里描述的问题,该函数可以接收任何事件并返回一个通道,该通道将接收该事件的消息:

(def socket-events (chan))
(def socket-pub (pub socket-events :event-type))

(defn on
  "Given a socket event type, returns a channel
  that subscribes to that event type on the
  socket publication."
  [event-type]
  (let [c (chan)]
    (sub socket-pub event-type c)
    c)))
它按照指南描述的那样工作:工作两次,然后停止工作

我不明白指南中的非工作示例与工作示例有何不同。据我所知,它看起来与工作输出通道示例完全相同,只是它正在侦听另一个事件。但我认为整个想法是一个人应该能够做到这一点

我遗漏了什么?

假设你的意思是“它可以工作两次”,第一个put可以工作并继续,第二个阻止,这是因为你订阅了
(chan)
。wiki中的警告指出,如果有消费者,整个链都会阻塞,不再接受

那么,如果您第一次将分派放入您的
(chan)
(可以存放一个项目),但没有消费者,这会阻塞整个链,那么会发生什么呢


根据您的用例,您可能希望在pub/sub内部或接收器端使用缓冲区。

前两个将工作,然后从第三个开始阻塞。消费者不再接受意味着什么?我在fn上使用如下命令:
(这是否意味着如果我只从这个订阅的频道接收一次,它仍然接收:将来关闭事件,而我不再从它们那里接收,整个链块?如果是这样,是否可以通过立即取消订阅来解决?PS在生产者端添加缓冲区没有任何区别,在消费者sid上添加n缓冲区e只会将问题延迟n次发布。是的,如果有注册消费者,则链块不会使用他们的(一个)缓冲区通道。在消费您感兴趣的一个事件时取消注册可能会有所帮助。如果此体系结构对您的用例有意义,则情况会有所不同。好的,谢谢。我已经找到了在消费者端取消订阅的方法,但这有点棘手。是否无法处理生产者端,因此不是每个消费者都必须手动取消订阅抄写员