如何在Clojure中执行同步并行功能?
我有一个应用程序,它有一个可以并行完成的初始流程:如何在Clojure中执行同步并行功能?,clojure,parallel-processing,Clojure,Parallel Processing,我有一个应用程序,它有一个可以并行完成的初始流程: 获取两个JSON文档(我用它) 解析这些文档(仅提取所需数据) 加入结果 将它们转储到一个文件中 所以有点像这样: some-entry-point /\ / \ / \ / \ fetchA fetchB | | | | parseA parseB \ / \ / \ / \ /
some-entry-point
/\
/ \
/ \
/ \
fetchA fetchB
| |
| |
parseA parseB
\ /
\ /
\ /
\ /
\/
join
|
|
dump
实现这一目标的正确和最新方法是什么
到目前为止,我发现:
(defn some-entry-point
[obja objb]
(let [pa (-> (fetchA obja)
parseA
future)
pb (-> (fetchB objb)
parseB
future)]
(-> (join @pa @pb)
dump)))
@
这里是函数的快捷方式(读卡器宏)
当然,您也可以在主线程中执行一个分支,只创建一个未来对象:
(defn some-entry-point
[obja objb]
(let [p (-> (fetchB objb)
parseB
future)]
(-> (fetchA obja)
parseA
(join @p)
dump)))
您还可以使用一些通用的fetch
和parse
函数来概括这种方法来获取和解析多个对象,用于并行化:
(defn some-entry-point
"Fetch and parse multiple objects in parallel"
[objs]
(->> objs
(pmap (comp parse fetch))
(apply join)
dump))
好的,它似乎在工作,但为什么我需要
(关机代理)
让我的程序立即退出?我在这里描述了一个问题:@squxy刚刚在我的Ubuntu 14.04.2 LTS
上用Clojure 1.6.0
和Leiningen 2.5.1在Java 1.8.0_45 Java HotSpot(TM)64位服务器虚拟机上检查了它,没有(关机代理)
,一切都正常工作。这看起来像是某个特定于平台/JVM的问题。尝试更新JVM。如果没有帮助,那么你就必须显式地调用(关机代理)
,尽管这对我来说并不是什么大问题。lein-v=>Java1.8.0\u40JavaHotSpot(TM)64位服务器虚拟机上的Leiningen2.5.1
那么idk为什么会这样。更正:future
不会返回承诺,它会返回未来。另请参见future?
谓词。我认为他们已经改变了这一点,但是Clojure代理使用非守护进程线程(此处:搜索“守护进程”)。如果有非守护进程线程在运行,JVM将不会关闭。