我有测试脚本
(defn foo [] ( print "OK!" ))
(print "main")
(future-call foo)
(print "end")
当我在REPL中运行时,总是很好
user=> (defn foo [] ( print "OK!" ))
#'user/foo
user=> (print "main")
mainnil
user=> (future-call foo)
OK!#<core$future_call$reify__6320@1d4997: nil>
user=> (print "end")
endnil
但是当我从控制台运行它时,我在代码执行完毕后会出现奇怪的冻结
$ time clojure-1.6 /tmp/1.clj
mainend
real 1m1.672s
user 0m2.229s
sys 0m0.143s
mainend
几乎立即显示,但返回shell需要大约一分钟。
pmap也很奇怪
(defn foo [x] ( print x ))
(print "main")
(pmap foo [1 2 3 4 5 6 7 8 9 0])
(print "end")
将显示
$ time clojure-1.6 /tmp/1.clj
main12365409end
real 1m1.688s
user 0m2.320s
sys 0m0.114s
我知道..365..
并发代码是正常的,但为什么7和8没有显示?
答案 0 :(得分:2)
您需要调用shutdown-agents
注意:如果省略对(shutdown-agents)的调用,程序将在大多数(所有?)OS / JVM组合中“挂起”1分钟,然后进程退出。它正在等待将来调用创建的线程关闭。 shutdown-agents将立即关闭它们,或者(System / exit)将立即退出而不等待它们关闭。
即使您通过内部使用它们的其他Clojure函数间接使用期货,也会发生此等待,例如pmap或clojure.java.shell/sh