首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么莱宁根被一个顶级的空虚的未来困住了?

为什么莱宁根被一个顶级的空虚的未来困住了?
EN

Stack Overflow用户
提问于 2014-06-06 18:19:04
回答 1查看 1K关注 0票数 2

下面是一个非常简单的示例Leiningen项目,它是用lein new app hanging制作的,只有两个文件,即project.clj

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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杀死它):

代码语言:javascript
复制
% lein clean && lein run   
Compiling hanging.core
1
2

在注释掉problematic Var定义后,这是输出(关闭JVM ):

代码语言:javascript
复制
% lein clean && lein run
Compiling hanging.core
1
2
1
2
3

我猜AOT是这里的罪魁祸首,但是有人能解释一下到底发生了什么吗?

我对第二个版本(注释)没有问题:在AOT期间,编译器执行所有顶级表单,这就是为什么在输出中出现了两次1和2。

但是,为什么在内部添加一个空的变量会改变这一点呢?这是否意味着编译器被困在AOT阶段?任何细节和建议都很感激..。

根据建议的答案,我已经将(shutdown-agents)添加到(-main)中,但它并没有改变编译步骤(编译大约需要60多个步骤)。但是,使用(shutdown-agents),程序不再挂起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-06 18:37:14

这与aot无关,而且与lein无关。

如果您添加了对(shutdown-agents)的调用,您的-main函数将返回,您的程序将不再挂起。Clojure的行为是,如果它的线程池工作人员仍然处于活动状态,则不退出,这取决于您是否让它知道它们已经完成。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24088302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档