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