下面是一个非常简单的示例Leiningen项目,它是用lein new app hanging制作的,只有两个文件,即project.clj
(defproject hanging "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.6.0"]]
:main hanging.core
:aot [hanging.core]
:target-path "target/%s"
:profiles {:uberjar {:aot :all}})和src/hanging/core.clj
(ns hanging.core (:gen-class))
(println "1")
(def problematic (future))
(println "2")
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println 3)) 在运行项目时,这是输出(使用提示冻结,我必须用c杀死它):
% lein clean && lein run
Compiling hanging.core
1
2在注释掉problematic Var定义后,这是输出(关闭JVM ):
% lein clean && lein run
Compiling hanging.core
1
2
1
2
3我猜AOT是这里的罪魁祸首,但是有人能解释一下到底发生了什么吗?
我对第二个版本(注释)没有问题:在AOT期间,编译器执行所有顶级表单,这就是为什么在输出中出现了两次1和2。
但是,为什么在内部添加一个空的变量会改变这一点呢?这是否意味着编译器被困在AOT阶段?任何细节和建议都很感激..。
根据建议的答案,我已经将(shutdown-agents)添加到(-main)中,但它并没有改变编译步骤(编译大约需要60多个步骤)。但是,使用(shutdown-agents),程序不再挂起。
发布于 2014-06-06 18:37:14
这与aot无关,而且与lein无关。
如果您添加了对(shutdown-agents)的调用,您的-main函数将返回,您的程序将不再挂起。Clojure的行为是,如果它的线程池工作人员仍然处于活动状态,则不退出,这取决于您是否让它知道它们已经完成。
https://stackoverflow.com/questions/24088302
复制相似问题