如何在Clojure中创建持续运行的后台进程?使用“未来”的循环永远不会以正确的方式结束吗?
答案 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