我该如何在Clojure中创建一个持续运行的后台进程?使用永不结束的循环和"future"是否是正确的方法?
我该如何在Clojure中创建一个持续运行的后台进程?使用永不结束的循环和"future"是否是正确的方法?
你可以通过启动一个永远运行的函数来开启一个线程。
(defn forever []
;; do stuff in a loop forever
)
(.start (Thread. forever))
如果您不希望后台线程阻止进程退出,请确保将其设置为守护线程:
(doto
(Thread. forever)
(.setDaemon true)
(.start))
我简单的高阶无限循环函数(使用 futures):
(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
我强烈建议使用原子(atom)或者Clojure的其他引用类型来存储结果(就像上面示例中的计数器一样)。
通过一点调整,您也可以使用这种方法以线程安全的方式启动/停止/暂停进程(例如,在循环的每次迭代中测试一个标志以查看是否应该执行(function))。
(defn infinite [f seconds] (future (loop [] (f) (Thread/sleep (* seconds 1000)) (recur))))
- Jaime Agudoinfinite-loop
的事实是在一个 future 中,这意味着它不会在原始函数的堆栈帧内重复出现。 - mikera