clojure,冻结后的未来和同样的

时间:2015-07-24 08:25:22

标签: concurrency clojure

我有测试脚本

(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没有显示?

1 个答案:

答案 0 :(得分:2)

您需要调用shutdown-agents

  

注意:如果省略对(shutdown-agents)的调用,程序将在大多数(所有?)OS / JVM组合中“挂起”1分钟,然后进程退出。它正在等待将来调用创建的线程关闭。 shutdown-agents将立即关闭它们,或者(System / exit)将立即退出而不等待它们关闭。

     

即使您通过内部使用它们的其他Clojure函数间接使用期货,也会发生此等待,例如pmap或clojure.java.shell/sh

来自https://clojuredocs.org/clojure.core/future