如何使Clojure go循环永远运行

How to make a Clojure go loop run forever

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

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

1
2
3
4
5
6
7
(defn -main
  []
  (println"Running forever...?")
  (async/go-loop [n 0]
                 (prn n)
                 (async/<!! (async/timeout 1000))
                 (recur (inc n))))

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

达成此目标的公认方法是什么?


主线程将保持JVM进程的运行(它不会关心go池中的线程)。

通过在主线程上阻塞来使其运行。例如

1
2
3
4
5
6
7
(defn -main
  []
  (println"Running forever...?")
  (async/<!! (async/go-loop [n 0]
                 (prn n)
                 (async/<! (async/timeout 1000))
                 (recur (inc n)))))

注意:您不应在go块内使用<!!。您应该改为使用<!


有多少种方法可以阻塞主线程……?

1
2
3
4
5
6
7
8
9
10
11
(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)。