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