我有一个顶级core.async去循环。我希望它无限期地运行,至少直到我用CTRL-C或kill或类似的信号发出信号。我目前使用java.lang.Runtime/addShutdownHook这样的:优雅地退出一个Clojure core.async去死循环
(ns async-demo.core
(:require [clojure.core.async :as async
:refer [<! >! <!! timeout chan alt! go]]))
(defn run [] (go (loop [] (recur))))
(.addShutdownHook (Runtime/getRuntime) (Thread. #(println "SHUTDOWN")))
这里是我的问题:
如果我启动REPL和
(run)
然后开始运行,并在后台线程。当我退出REPL时,我看不到所需的关闭消息。但是,当我从
lein run
运行时,go循环立即退出并显示“SHUTDOWN”。
两者都不是我想要的。
我不一定期望找到适用于所有JVM的解决方案。我开发在Mac上并部署到Ubuntu的,所以我想找到两个有效的解决方案:
的Mac JVM:Java版本“1.7.0_45”的Java(TM)SE运行时环境(建1.7.0_45-b18)Java HotSpot™64位服务器虚拟机(版本24.45-b08,混合模式)
Ubuntu JVM:Java版本“1.7.0_25”OpenJDK运行时环境(IcedTea 2.3.10)( 7u25-2.3.10-1ubuntu0.12.04.2)OpenJDK的64位服务器VM(构建23.7-B01,混合模式)
参见:http://stackoverflow.com/questions/11709639/how-to-catch-ctrlc-in-clojure –
参见:http://stackoverflow.com/questions/18612063/clojure- core-async-cpu-timeout-timeout –