我有一个应用程序,其初始流程可以并行完成:
答案 0 :(得分:4)
由于此处只有两个分支,因此最好使用future函数将并行作业分配给单独的线程。 future将返回一个未来对象(一个特殊的承诺,将在作业完成时自动解决)。
以下是它的外观:
(defn some-entry-point
[obja objb]
(let [pa (-> (fetchA obja)
parseA
future)
pb (-> (fetchB objb)
parseB
future)]
(-> (join @pa @pb)
dump)))
@
这是deref函数的快捷方式(阅读器宏)。
当然,您可以在主线程中执行其中一个分支,只创建一个未来对象:
(defn some-entry-point
[obja objb]
(let [p (-> (fetchB objb)
parseB
future)]
(-> (fetchA obja)
parseA
(join @p)
dump)))
您还可以使用fetch
和parse
函数概括此方法来获取和解析多个对象,使用pmap进行并行化:
(defn some-entry-point
"Fetch and parse multiple objects in parallel"
[objs]
(->> objs
(pmap (comp parse fetch))
(apply join)
dump))