在Clojure中定期执行代码

时间:2011-11-22 00:13:59

标签: clojure timing

在Clojure中定期运行代码的最佳方法是什么?我目前正在使用java.util.concurrent.ScheduledExecutorService,但那个Java - 是否有一种Clojure方式来调度代码以定期的间隔运行,在延迟之后,可以取消?我见过的所有Clojure代码示例都使用Thread / sleep,这似乎也是Java。

4 个答案:

答案 0 :(得分:21)

值得查看Overtone的源代码,尤其是code for scheduling events at a particular time

这是一个音乐合成系统,所以你必须希望他们有正确的时间码!!

他们还帮助将时间码分离到一个单独的项目(overtone/at-at)中,以便您可以根据需要轻松导入。这为底层Java库(即ScheduledThreadPoolExecutor和朋友)提供了一个很好的Clojure包装器。语法如下:

;; run some-function every 500ms
(every 500 some-function)

您还可以在特定时间举办活动:

;; run some-other-function 10 seconds from now
(at (+ 10000 (now)) some-other-function)

答案 1 :(得分:16)

来自clojure网站http://clojure.org/concurrent_programming

  

在所有情况下,Clojure都不会替换Java线程系统,而是使用它。 Clojure函数是java.util.concurrent.Callable,因此它们与Executor框架等一起使用。

听起来你已经以正确的方式做到了。

(import 'java.util.concurrent.Executors)
(import 'java.util.concurrent.TimeUnit) 
(.scheduleAtFixedRate (Executors/newScheduledThreadPool 1) 
  #(println "Hello") 0 5 TimeUnit/SECONDS)

答案 2 :(得分:1)

我回答了我自己的问题@ Implementing a cron type scheduler in clojure

也许cronj可能会有所帮助?

答案 3 :(得分:0)

“tools.timer”库是Java Timer包装器:https://github.com/Ruiyun/tools.timer

它非常易于使用:

(use 'ruiyun.tools.timer)
(run-task! #(println "Say hello every 5 seconds.") :period 5000)