考虑以下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
没有按照我的预期运作。
关于我做错什么的任何想法?
答案 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
立即关闭应用程序。