我正在寫一個小clojure pub/sub界面。它非常準確,只有兩種實際使用的方法:do-pub和sub-listen。子偵聽需要一個字符串(一個子名),do-pub需要兩個字符串(一個子名和一個值)。Clojure:需要架構建議
我在clojure還是比較新的,並且遇到了一些麻煩,想出了一個可行的方法來做到這一點。我首先想到的(實際上是我的第一個執行)使用其持有的哈希單一代理:
{ subname (promise1 promise2 etc) }
當一個線程要分呢連詞是一個承諾對象就是了子相關聯的列表,然後立即嘗試取消引用該承諾(因此阻止)。
當一個酒吧發生時,它會遍歷該列表中的每個項目並將該值傳遞給該項目(承諾)。然後它從地圖中解析出該子名並將其返回給代理。
以這種方式,我得到了一個簡單的酒吧子實現工作。但是,如果有人下潛,在一段時間內沒有收到酒吧,則會因爲超時而被殺。在這種情況下,代理中會有一個不值錢的承諾,而且如果該子從不被髮布,這將成爲內存泄漏的來源。
有沒有人有任何想法如何解決這個問題?或者,如果有更好的方法來做我想要做的事情(我試圖避免使用任何外部預煮熟的pubsub庫,這是一個寵物項目不是工作)?