首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用clojure调度程序

使用clojure调度程序
EN

Stack Overflow用户
提问于 2015-03-14 21:02:17
回答 1查看 418关注 0票数 0

如何使用at-atchime每分钟正确计算一个函数

以下是我的测试:

代码语言:javascript
复制
(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分钟后:

代码语言:javascript
复制
@data1
;;=> {:num 5}
@data2
;;=> {:num 8}
@data3
;;=> {:num 1}

为什么at-at计数速度快?为什么chime根本不算?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 04:23:21

不知道怎么回事。

对于Chime,chime-at用当前提示的时间调用回调函数,因此需要将回调修改为如下

代码语言:javascript
复制
(fn [time] (swap! data3 update-in [:num] inc))

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

(顺便说一句,在1.7alpha中,您可以使用update :num而不是update-in [:num]。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29054161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档