Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency clojure,呼叫后冻结未来和相同_Concurrency_Clojure - Fatal编程技术网

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