为什么clojure的未来阻止主线程?

Tra*_*sun 3 clojure

我有一个简单的lein项目,其中-main包含一个未来:

(def f (future 42))

(defn -main [& args]
  (println @f))
Run Code Online (Sandbox Code Playgroud)

当我运行lein run它打印42但不返回.

我不明白为什么不回来?

我怎么lein run回来?

leo*_*ges 7

你的问题真是双重的:

  1. lein为什么不回来?

lein挂起,因为支持Clojure期货的线程池不使用守护程序线程,所以你必须明确地关闭它.如果您将代码更改为以下代码,它应该工作:

(def f (future 42))

(defn -main [& args]
  (println @f)
  (shutdown-agents))
Run Code Online (Sandbox Code Playgroud)
  1. 期货阻止主线程

如果未来尚未完成其工作,该行(println @f)可能会在"derefing"时阻止主线程f.

这是Clojure期货的限制,可以使用core.asyncRxClojure解决.我也一直在为Clojure开发一个替代的期货实现,我计划很快开源并解决这些问题.