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

时间:2014-11-19 10:16:28

标签: clojure

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

(def f (future 42))

(defn -main [& args]
  (println @f))

当我运行lein run时,它会打印42但不会返回。

我不明白为什么不回来?

如何让lein run返回?

1 个答案:

答案 0 :(得分:7)

你的问题非常双重:

  1. lein为什么不回来?
  2. lein挂起,因为支持Clojure期货的线程池不使用守护程序线程,所以你必须明确地关闭它。如果您将代码更改为以下代码,则应该有效:

    (def f (future 42))
    
    (defn -main [& args]
      (println @f)
      (shutdown-agents))
    
    1. 期货阻止主线程
    2. 如果未来尚未完成其工作,那么“{1}}行可能会在”derefing“(println @f)时阻止主线程。

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