2012-10-03 31 views
4

我使用Lamina來實現基本的pubsub模式。Lamina undo siphon - Clojure

當客戶訂閱某個主題時,我爲它創建了一個新的channel(如果它尚不存在),然後siphon它爲客戶的channel。但是,我無法弄清楚如何反轉這個讓客戶端取消訂閱。我一直在搜索文檔和谷歌搜索,但找不到任何東西。

如何取消siphon的作用?

回答

1

通常你會成爲一個橋通道,你可以關閉,這樣的聯動是:

話題通道 - >橋聲道 - >客戶端通道

在0.5.0,這是容易的,因爲虹吸是可變參數:

(defn cancellable-siphon [src dst] 
    (let [bridge (channel)] 
    (siphon src bridge dst) 
    #(close bridge))) 
+0

會是一個更好的主意,只是有一個'收到-all'它確實像' #(doseq [ch訂戶] (enqueue ch%))',還是bridge'channel'引入的開銷可以忽略不計? –

+1

使用現有原語的消息傳播幾乎總是比您自己編寫的東西更快(每個額外節點需要〜70ns才能遍歷)。同時使用'enqueue'也不是一個好主意,因爲它通過創建隱式而非顯式的消息流來打破自動關閉行爲。 – ztellman

3

您可以fork虹吸上方的上游通道,然後將下游通道接地,或者如果圖形允許,您可以關閉通道,不再需要虹吸形成上游通道。

PS:我會試着在以後添加例如...