如何在Clojure中创建一个持续运行的后台进程?

时间:2010-12-30 06:44:03

标签: concurrency clojure

如何在Clojure中创建持续运行的后台进程?使用“未来”的循环永远不会以正确的方式结束吗?

3 个答案:

答案 0 :(得分:15)

你可以用一个永远运行的函数启动一个Thread。

(defn forever []
  ;; do stuff in a loop forever
)

(.start (Thread. forever))

如果您不希望后台线程阻止进程退出,请确保使其成为守护程序线程:

(doto 
   (Thread. forever)
   (.setDaemon true)
   (.start))

如果您想要更精细一些,可以使用java.util.concurrent.Executors工厂来创建ExecutorService。这样可以轻松创建线程池,使用自定义线程工厂,自定义传入队列等。

claypoole lib将一些工作执行内容包装成一个更加适合clojure的api,如果那是你正在寻找的东西。

答案 1 :(得分:5)

我的简单高阶无限循环函数(使用期货):

(def counter (atom 1))

(defn infinite-loop [function]   
  (function)
  (future (infinite-loop function))
  nil) 

;; note the nil above is necessary to avoid overflowing the stack with futures...

(infinite-loop 
  #(do 
     (Thread/sleep 1000) 
     (swap! counter inc)))

;; wait half a minute....

@counter
=> 31

我强烈建议使用原子或Clojures其他引用类型之一来存储结果(根据上面示例中的计数器)。

通过一些调整,你也可以使用这种方法以线程安全的方式启动/停止/暂停进程(例如,测试一个标志,看看是否应该在循环的每次迭代中执行(函数))。

答案 2 :(得分:1)

也许,或者也许是Lein-daemon? https://github.com/arohner/lein-daemon