从uberjar运行时,如何在Clojure中强制计算惰性seq?

从uberjar运行时,如何在Clojure中强制计算惰性seq?,clojure,lazy-sequences,uberjar,Clojure,Lazy Sequences,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,它将按预期工作:它创

考虑以下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
,它将按预期工作:它创建文件并返回。但是,如果我创建一个uberjar并运行
java-jar
,它将创建文件,但无法退出程序。我怀疑这是一个懒惰的问题,但我不明白为什么
dorun
没有像我预期的那样工作。 有没有关于我做错了什么的想法?

在Clojure中,函数使用利用公共线程池的调用。池中的线程在完成任务后保持活动状态1分钟,以降低线程分配的成本

如果您确定线程池可以关闭(因为应用程序退出),则需要在
(dorun…
)之后调用线程池,以便终止线程池

或者,您可以调用
(System/exit)
立即关闭应用程序。

在Clojure中,函数使用利用公共线程池的调用。池中的线程在完成任务后保持活动状态1分钟,以降低线程分配的成本

如果您确定线程池可以关闭(因为应用程序退出),则需要在
(dorun…
)之后调用线程池,以便终止线程池


或者,您可以调用
(系统/退出)
立即关闭应用程序。

这看起来不像是懒惰问题。如果所有文件都被创建了,那么惰性序列就实现了。dorun在任何情况下都会遍历seq的后续序列,那么您得到的失败消息是什么?没有错误消息,只是
java-jar…
调用从未返回。Leonid,您是对的,seq实现了。然而,应用程序并没有从main返回…@mvarela您能否提供有关您的环境的其他信息:操作系统类型和版本、
java
clojure
lein
版本?这看起来不像是懒惰问题。如果所有文件都被创建了,那么惰性序列就实现了。dorun在任何情况下都会遍历seq的后续序列,那么您得到的失败消息是什么?没有错误消息,只是
java-jar…
调用从未返回。Leonid,您是对的,seq实现了。但是,应用程序没有从main返回…@mvarela您可以提供有关您的环境的其他信息吗:操作系统类型和版本、
java
clojure
lein
版本?谢谢!
shutdown agents
呼叫成功了。谢谢!
shutdown agents
调用成功了。