2011-04-07 54 views

回答

4

你可能add-watch每次寫入ref時都會更新訪問時間(你提到它主要是寫入)。這會給你一個忙碌的機會。

(def my-ref (ref {})) 
(def my-ref-atime (atom 0)) 
(add-watch my-ref (fn [key ref old new] (swap! my-ref-atime current-time-fn)))) 

然後當atime過去大於10ms時才做低優先級的工作。

+0

正確和簡單。當我看到這個答案時,就是其中的一個「爲什麼我沒有想到這個!」時刻。謝謝! – Zubair 2011-04-07 20:11:31

1

您確定要使用ref而不是agent

這聽起來像你想執行更新,但你不關心更新實際發生的時間(只要他們最終發生)。這正是agents用於:以異步和獨立的方式共享狀態。 Refs用於以同步和協調的方式共享狀態。

構造應用程序邏輯是否屬於交易對我來說聽起來不是個好主意。也許如果你提供更多的細節,人們可以想出更好的設計。

+0

我確實在意某些事務發生更新的時間,因爲有很多寫操作。我希望一些不太重要的更新發生在ref不太忙的時候,以減少爭用。 – Zubair 2011-04-07 16:00:03

+0

關於重新考慮設計的一個很好的觀點...我會更多地考慮這個 – Zubair 2011-04-07 16:22:33

4

你可能會問一個單一的身份做太多。考慮有兩個身份:一個具有較高的寫入量,另一個(可能是派生的)身份偶爾會更新。

你的方法已經暗示偶爾的更新不是參考文獻時間表的一部分,因爲你願意推遲它們。