从uberjar运行时,如何在Clojure中强制计算惰性seq?
考虑以下MWE:从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,它将按预期工作:它创
(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
调用成功了。