如何判断Clojure中的dosync是否正在更新ref?

时间:2011-04-07 15:47:04

标签: clojure

我需要对ref进行一些更新,但是当ref没有被大量使用时,我想选择一个时间来执行更新。有没有一种方法可以编程告诉ref何时进行交易?

3 个答案:

答案 0 :(得分: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时才执行低优先级工作。

答案 1 :(得分:4)

您可能会要求单个身份做太多。考虑具有两个身份:一个具有高写入量,另一个(可能是派生的)身份偶尔更新。

您的方法已经暗示偶尔的更新不是裁判时间表的一部分,因为您愿意推迟更新。

答案 2 :(得分:1)

您确定要使用ref而不是agent吗?

听起来我想要执行更新,但是你并不关心更新何时实际发生(只要它们最终发生)。这正是agents的用途:以异步和独立的方式共享状态。 Refs用于以同步和协调的方式共享状态。

围绕ref是否在交易中构建应用程序逻辑听起来对我来说不是一个坏主意。也许如果你提供更多细节,有人可以提出更好的设计。