鑑於STM擁有10個參考值,代理等歷史記錄,可以讀取這些值嗎?可以訪問Clojure的STM的值歷史嗎?
原因是,我正在更新一個代理負載,我需要保持值的歷史記錄。如果STM已經保留了它們,我寧願使用它們。我無法在API中找到看起來像從STM歷史中讀取值的函數,所以我猜不到,我也不能在Java源代碼中找到任何方法,但也許我看起來不正確。
鑑於STM擁有10個參考值,代理等歷史記錄,可以讀取這些值嗎?可以訪問Clojure的STM的值歷史嗎?
原因是,我正在更新一個代理負載,我需要保持值的歷史記錄。如果STM已經保留了它們,我寧願使用它們。我無法在API中找到看起來像從STM歷史中讀取值的函數,所以我猜不到,我也不能在Java源代碼中找到任何方法,但也許我看起來不正確。
您無法直接訪問值的stm歷史記錄。但是你可以利用add-watch記錄值的歷史:
(def a-history (ref []))
(def a (agent 0))
(add-watch a :my-history
(fn [key ref old new] (alter a-history conj old)))
每次a
更新(STM的事務提交)舊值將conjed到了在a-history
舉行的序列。
如果你想獲得訪問所有中間值,即使回滾事務,你可以在交易過程中發送的值,以代理:
(def r-history (agent [])
(def r (ref 0))
(dosync (alter r
(fn [new-val]
(send r-history conj new-val) ;; record potential new value
(inc r)))) ;; update ref as you like
交易完成後,所有更改代理r-history
將被執行。
+1。還值得注意的是,在很多情況下(由於持久的數據結構),保留過去的值將比使用整個副本佔用更少的空間。所以這實際上可能是一種非常節省空間的存儲歷史的方式。 – mikera
感謝您的額外想法。最後我使用了clojure.lang.PersistentQueue – Hendekagon
你的留言不正確。沒有歷史可以閱讀,因爲沒有歷史。當事務提交時,舊值不再被引用並且有資格進行垃圾回收。 – Gabe
哦,我現在看到,歷史只在交易期間舉行。感謝你的回答。 – Hendekagon