2015-03-14 2 views
0

Как правильно оценивать функцию каждую минуту, используя at-at и chime?Использование планировщиков clojure

Вот мои тесты:

(require '[overtone.at-at :refer :all] 
     '[chime :refer [chime-at]] 
     '[clj-time.periodic :refer [periodic-seq]] 
     '[clj-time.core :as t]) 

;; 1. Use of future 

(defonce data1 (atom {:num 1})) 

(defonce updater 
    (future 
    (while true 
     (swap! data1 update-in [:num] inc) 
     (Thread/sleep 60000)))) 


;; 2. Using at-at 

(defonce data2 (atom {:num 1})) 

(def my-pool (mk-pool)) 

(every 60000 #(swap! data2 update-in [:num] inc) my-pool) 


;; 3. Using chime 

(defonce data3 (atom {:num 1})) 

(chime-at (periodic-seq (t/now) (-> 60 t/seconds)) 
      (fn [] (swap! data3 update-in [:num] inc)) 
      {:error-handler (fn [e] (str e))}) 

Через 5 минут:

@data1 
;;=> {:num 5} 
@data2 
;;=> {:num 8} 
@data3 
;;=> {:num 1} 

Почему at-at рассчитывает поститься? Почему chime не учитывает вообще?

Спасибо!

ответ

1

Не уверен, что случилось с at-at.

Что касается куранты, chime-at вызывает функцию обратного вызова во время текущего звукового сигнала, так что вам нужно изменить свой обратный вызов на что-то вроде

(fn [time] (swap! data3 update-in [:num] inc)) 

С (fn [] …) вы получите ArityException на каждом звон и ваш :error-handler проглатывает их. (Обработчик по умолчанию для Chime печатает трассировку стека, в зависимости от вашей настройки трассировка стека может быть или не быть видимой в вашем окне REPL - например, с довольно типичной настройкой Emacs/CIDER вам, возможно, придется переключиться на буфер *nrepl-server*, чтобы увидеть это.)

(кстати, в 1,7 альфы вы можете использовать update :num вместо update-in [:num].)

+0

Спасибо, теперь он работает прекрасно. Что касается 'at-at', мне нужно добавить': fixed-delay true' в конце вызова. – leontalbot

Смежные вопросы