Как я могу узнать, обновляется ли ссылка с помощью dosync в Clojure? - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть некоторые обновления, которые необходимо сделать для ссылки, но я хочу выбрать время для выполнения обновлений, когда ссылка не используется интенсивно.Есть ли способ, которым я могу программно сказать, когда ссылка находится в транзакции?

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

вы могли бы <a href="http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/add-watch" rel="nofollow">add-watch</a>, который обновлял бы время доступа каждый раз, когда пишется ваш реф (в основном вы упоминаете, что это запись).Это даст вам ощущение занятости.

(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 превышает 10 мс в прошлом.

4 голосов
/ 07 апреля 2011

Возможно, вы просите одну личность сделать слишком много. Подумайте о наличии двух идентификаторов: один с большим объемом записи, а другой (возможно, производный), который иногда обновляется.

Ваш подход уже подразумевает, что случайные обновления не являются частью временной шкалы реф, поскольку вы готовы отложить их.

1 голос
/ 07 апреля 2011

Вы уверены, что хотите использовать ref , а не агент ?

Мне кажется, что вы хотите выполнять обновления, но вас не волнует, когда эти обновления действительно произойдут (если только они случаются). Это именно то, что agents используется для: совместного использования состояния асинхронным и независимым способом. Refs предназначены для совместного использования состояния синхронным и скоординированным образом.

Структурирование логики приложения вокруг того, находится ли ссылка в транзакции, звучит для меня как плохая идея. Может быть, если вы предоставите больше деталей, кто-то может придумать лучший дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...