我使用Lamina來實現基本的pubsub模式。Lamina undo siphon - Clojure
當客戶訂閱某個主題時,我爲它創建了一個新的channel
(如果它尚不存在),然後siphon
它爲客戶的channel
。但是,我無法弄清楚如何反轉這個讓客戶端取消訂閱。我一直在搜索文檔和谷歌搜索,但找不到任何東西。
如何取消siphon
的作用?
我使用Lamina來實現基本的pubsub模式。Lamina undo siphon - Clojure
當客戶訂閱某個主題時,我爲它創建了一個新的channel
(如果它尚不存在),然後siphon
它爲客戶的channel
。但是,我無法弄清楚如何反轉這個讓客戶端取消訂閱。我一直在搜索文檔和谷歌搜索,但找不到任何東西。
如何取消siphon
的作用?
通常你會成爲一個橋通道,你可以關閉,這樣的聯動是:
話題通道 - >橋聲道 - >客戶端通道
在0.5.0,這是容易的,因爲虹吸是可變參數:
(defn cancellable-siphon [src dst]
(let [bridge (channel)]
(siphon src bridge dst)
#(close bridge)))
您可以fork
虹吸上方的上游通道,然後將下游通道接地,或者如果圖形允許,您可以關閉通道,不再需要虹吸形成上游通道。
PS:我會試着在以後添加例如...
會是一個更好的主意,只是有一個'收到-all'它確實像' #(doseq [ch訂戶] (enqueue ch%))',還是bridge'channel'引入的開銷可以忽略不計? –
使用現有原語的消息傳播幾乎總是比您自己編寫的東西更快(每個額外節點需要〜70ns才能遍歷)。同時使用'enqueue'也不是一個好主意,因爲它通過創建隱式而非顯式的消息流來打破自動關閉行爲。 – ztellman