Clojure 为什么莱宁根会被一个顶级的空未来所困扰?
下面是一个非常简单的Leiningen项目示例,使用Clojure 为什么莱宁根会被一个顶级的空未来所困扰?,clojure,leiningen,Clojure,Leiningen,下面是一个非常简单的Leiningen项目示例,使用lein new app悬挂,仅使用两个文件project.clj: (定义项目挂起“0.1.0-SNAPSHOT” :依赖项[[org.clojure/clojure“1.6.0”]] :主挂片。核心 :aot[挂起.核心] :目标路径“target/%s” :profiles{:uberjar{:aot:all}) 和src/hanging/core.clj: (ns.core(:gen类)) (println“1”) (未来) (pri
lein new app悬挂
,仅使用两个文件project.clj
:
(定义项目挂起“0.1.0-SNAPSHOT”
:依赖项[[org.clojure/clojure“1.6.0”]]
:主挂片。核心
:aot[挂起.核心]
:目标路径“target/%s”
:profiles{:uberjar{:aot:all})
和src/hanging/core.clj
:
(ns.core(:gen类))
(println“1”)
(未来)
(println“2”)
(defn-main)
“我还没有做很多……还没有。”
[&args]
(第3页)
运行项目时,这是输出(提示冻结,我必须用C-C终止它):
%lein清理和运行(&L)
编译.core
1.
2.
注释掉有问题的Var定义后,这是输出(JVM关闭时):
%lein清理和运行(&L)
编译.core
1.
2.
1.
2.
3.
我猜AOT是罪魁祸首,但有人能解释到底发生了什么吗
我对第二个(注释)版本没有问题:在AOT期间,编译器执行所有顶级表单,这就是为什么1和2在输出中出现两次
但是,为什么添加内部未来为空的var会改变这一点呢?这是否意味着编译器陷入AOT阶段?任何细节和指示都非常感谢
根据建议的答案,我已将(关机代理)
添加到(-main)
,但它不会更改编译步骤(编译大约需要60秒)。但是,使用(关机代理)
程序不再挂起。这与aot无关,而且与lein无关
如果添加对(关机代理程序)
的调用,则-main
函数将返回,程序将不再挂起。Clojure的行为是,如果任何线程池工作人员仍然处于活动状态,则不退出,这取决于您是否让它知道他们已经完成了 添加(关闭代理)对编译步骤没有任何作用,它仍然会挂起一段时间。它确实有助于主应用程序,它现在立即存在。我猜在AOT期间,编译器会在将来运行,然后等待它完成。是的,这是有文档记录的行为。当您进行AOT时,作为编译过程的一部分,名称空间中的所有顶级表单都是eval
d。如果您以顶级形式创建一个未来
,它将创建未来,那么您的编译过程将挂起,因为它从不调用关闭代理