当来自 uberjar 的 运行 时,如何在 Clojure 中强制评估惰性序列?
How to force evaluation of lazy seqs in Clojure when running from an uberjar?
考虑以下 MWE:
(ns toto.core
(:gen-class))
(defn write-something [i]
(spit (str "out-" (str i) ".txt") "Hi there!"))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(dorun (pmap write-something (range 16))))
如果我从 REPL 运行 -main
,它按预期工作:它创建文件和 returns。但是,如果我创建一个 uberjar 和 运行 java -jar <toto.whatever-standalone.jar>
它将创建文件,但无法退出程序。我怀疑这是懒惰的问题,但无法理解为什么 dorun
没有像我预期的那样工作。
关于我做错了什么的想法?
在 Clojure 中,pmap function uses future 调用使用公共线程池。池中的线程在完成任务后会存活 1 分钟,以减少线程分配的成本。
如果你确定线程池可以关闭(因为应用程序退出)你需要调用
shutdown-agents 在 (dorun ...)
之后线程池被杀死。
或者,您可以调用 (System/exit <status>)
立即关闭应用程序。
考虑以下 MWE:
(ns toto.core
(:gen-class))
(defn write-something [i]
(spit (str "out-" (str i) ".txt") "Hi there!"))
(defn -main
"I don't do a whole lot ... yet."
[& args]
(dorun (pmap write-something (range 16))))
如果我从 REPL 运行 -main
,它按预期工作:它创建文件和 returns。但是,如果我创建一个 uberjar 和 运行 java -jar <toto.whatever-standalone.jar>
它将创建文件,但无法退出程序。我怀疑这是懒惰的问题,但无法理解为什么 dorun
没有像我预期的那样工作。
关于我做错了什么的想法?
在 Clojure 中,pmap function uses future 调用使用公共线程池。池中的线程在完成任务后会存活 1 分钟,以减少线程分配的成本。
如果你确定线程池可以关闭(因为应用程序退出)你需要调用
shutdown-agents 在 (dorun ...)
之后线程池被杀死。
或者,您可以调用 (System/exit <status>)
立即关闭应用程序。