当来自 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>) 立即关闭应用程序。