Concurrency clojure,呼叫后冻结未来和相同
我有测试脚本Concurrency clojure,呼叫后冻结未来和相同,concurrency,clojure,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__632
(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
maintend
几乎立即显示,但返回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
我知道并发代码是正常的,但是为什么不显示7和8呢?您需要调用关机代理 注意:如果不调用(关闭代理),程序将在进程退出之前在大多数(所有?)OS/JVM组合上“挂起”1分钟。它正在等待由未来调用创建的线程关闭。关闭代理将立即关闭它们,或者(系统/出口)将在不等待它们关闭的情况下立即退出 即使您通过其他一些在内部使用期货的Clojure函数(如pmap或Clojure.java.shell/sh)间接使用期货,也会发生这种等待
来自$java-version java version“1.7.079”OpenJDK运行时环境(IcedTea 2.5.5)(Gentoo包IcedTea-7.2.5.5)OpenJDK服务器虚拟机(构建24.79-b02,混合模式)Clojure 1.6Thanks!干得好。但仍有一些数字丢失。当我调用(关闭代理)时,它是正确的-线程未完成工作,代理杀死它们。但为什么特工不打电话来?进程应该等待结束线程,不是吗?在线程完成后,您需要调用关闭代理。vm没有通用的方法来知道所有线程是否都准备好关闭。如果您需要运行各种未来任务,并且需要立即关机,则需要在您自己的应用程序逻辑中确保所有线程都已完成其工作,然后调用
关机代理
。非常感谢,noisesmith!
$ time clojure-1.6 /tmp/1.clj
main12365409end
real 1m1.688s
user 0m2.320s
sys 0m0.114s