我想使用Clojure core.async来编写一个循环轮询服务的应用程序,但到目前为止我的尝试意外终止。
当我运行此程序时,它会打印消息然后退出:
(defn -main
[]
(println "Running forever...?")
(async/go-loop [n 0]
(prn n)
(async/<!! (async/timeout 1000))
(recur (inc n))))
我希望程序永远运行(直到JVM进程被终止)。
实现这一目标的可接受方式是什么?
答案 0 :(得分:6)
主线程将保持JVM进程运行(它不关心go
池中的线程)。
通过阻止主线程使其保持运行。 e.g。
(defn -main
[]
(println "Running forever...?")
(async/<!! (async/go-loop [n 0]
(prn n)
(async/<! (async/timeout 1000))
(recur (inc n)))))
注意:您不应在<!!
块内使用go
。您应该使用<!
。
答案 1 :(得分:1)
有多少种方法可以阻止主线程......?
(defn -main []
(println "Running forever...?")
; go-loop runs forever in another (daemon) thread
(async/go-loop [n 0]
(prn n)
(async/<!! (async/timeout 1000))
(recur (inc n))
; hang the main thread
(Thread/sleep 111222333444)) ; long enough....
(或者您可以使用Long/MAX_VALUE
)。