如何使Clojure go循环永远运行

时间:2017-03-22 15:08:34

标签: clojure

我想使用Clojure core.async来编写一个循环轮询服务的应用程序,但到目前为止我的尝试意外终止。

当我运行此程序时,它会打印消息然后退出:

(defn -main
  []
  (println "Running forever...?")
  (async/go-loop [n 0]
                 (prn n)
                 (async/<!! (async/timeout 1000))
                 (recur (inc n))))

我希望程序永远运行(直到JVM进程被终止)。

实现这一目标的可接受方式是什么?

2 个答案:

答案 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)。