使用clojure调度程序

时间:2015-03-14 21:02:17

标签: clojure scheduler

如何使用at-atchime

每分钟正确评估一项功能

以下是我的测试:

(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 个答案:

答案 0 :(得分:1)

不确定与at-at有什么关系。

对于Chime,chime-at使用当前铃声的时间调用回调函数,因此您需要将回调修改为

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

使用(fn [] …),您会在每个铃声中获得ArityException,而:error-handler会吞下这些铃声。 (Chime的默认处理程序打印堆栈跟踪; NB。根据您的设置,堆栈跟踪可能在REPL窗口中可见或不可见 - 例如,使用相当典型的Emacs / CIDER设置,您可能必须切换到*nrepl-server*缓冲区可以看到它。)

(顺便提一下,在1.7 alphas中,您可以使用update :num代替update-in [:num]。)