如何从uberjar运行时强制评估Clojure中的lazy seqs?

时间:2017-09-25 10:28:36

标签: 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,它会按预期工作:它会创建文件并返回。但是,如果我创建一个uberjar并运行java -jar <toto.whatever-standalone.jar>它将创建文件,但无法退出该程序。我怀疑这是一个懒惰的问题,但无法解释为什么dorun没有按照我的预期运作。  关于我做错什么的任何想法?

1 个答案:

答案 0 :(得分:4)

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

如果您确定可以关闭线程池(因为应用程序退出),您需要在def score(dice) ones = fives = rest = 0 one_count = dice.count(1) if one_count > 2 ones = 1000 one_count -= 3 end ones += one_count * 100 five_count = dice.count(5) if five_count > 2 fives = 500 five_count -= 3 end fives += five_count * 50 [2,3,4,6].each do |num| if dice.count(num) > 2 rest += num * 100 end end return ones + fives + rest end 之后调用 shutdown-agents,以便线程池被终止。

或者,您可以致电drop table if exists t; create table t(u_id int,g_id int,S_id int,tn int); insert into t values (1,1234,158990,30), (1,1234,158991,60), (1,3211,9988,-55), (1,3211,9989,65); select concat('{',group_concat(g_id,':{',gc,'}'),'}') from (SELECT g_id ,GROUP_CONCAT(s_id,':',tn) gc FROM t WHERE u_id = 1 and g_id in (1234,3211) group by g_id ORDER by g_id ) s 立即关闭应用程序。