我有一个简单的lein项目,其中-main
包含未来:
(def f (future 42))
(defn -main [& args]
(println @f))
当我运行lein run
时,它会打印42
但不会返回。
我不明白为什么不回来?
如何让lein run
返回?
答案 0 :(得分:7)
你的问题非常双重:
lein挂起,因为支持Clojure期货的线程池不使用守护程序线程,所以你必须明确地关闭它。如果您将代码更改为以下代码,则应该有效:
(def f (future 42))
(defn -main [& args]
(println @f)
(shutdown-agents))
如果未来尚未完成其工作,那么“{1}}行可能会在”derefing“(println @f)
时阻止主线程。
这是Clojure期货的限制,可以使用core.async或RxClojure解决。我也一直在为Clojure开发一个替代的期货实现,我计划很快开源并解决这些问题。