使用 clojure 调度程序
Using clojure schedulers
如何使用at-at
和chime
每分钟正确评估一个函数?
这是我的测试:
(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
根本不算数?
谢谢!
不确定 at-at 是怎么回事。
至于 Chime,chime-at
使用当前钟声的时间调用回调函数,因此您需要将回调修改为
(fn [time] (swap! data3 update-in [:num] inc))
使用 (fn [] …)
时,您会在每次提示音时得到一个 ArityException
,而您的 :error-handler
会吞下这些。 (Chime 的默认处理程序打印堆栈跟踪;注意。根据您的设置,堆栈跟踪在您的 REPL window 中可能可见,也可能不可见——例如,对于相当典型的 Emacs/CIDER 设置,您可能需要切换到 *nrepl-server*
缓冲区以查看它。)
(顺便说一下,在 1.7 alpha 中你可以使用 update :num
而不是 update-in [:num]
。)
如何使用at-at
和chime
每分钟正确评估一个函数?
这是我的测试:
(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
根本不算数?
谢谢!
不确定 at-at 是怎么回事。
至于 Chime,chime-at
使用当前钟声的时间调用回调函数,因此您需要将回调修改为
(fn [time] (swap! data3 update-in [:num] inc))
使用 (fn [] …)
时,您会在每次提示音时得到一个 ArityException
,而您的 :error-handler
会吞下这些。 (Chime 的默认处理程序打印堆栈跟踪;注意。根据您的设置,堆栈跟踪在您的 REPL window 中可能可见,也可能不可见——例如,对于相当典型的 Emacs/CIDER 设置,您可能需要切换到 *nrepl-server*
缓冲区以查看它。)
(顺便说一下,在 1.7 alpha 中你可以使用 update :num
而不是 update-in [:num]
。)