如何在Clojure中执行同步并行功能?

时间:2015-06-08 08:02:34

标签: clojure parallel-processing

我有一个应用程序,其初始流程可以并行完成:

  1. 获取两个JSON文档(我使用clj-http
  2. 解析这些文档(仅提取所需数据)
  3. 加入结果
  4. 将它们转储成一个文件
  5. 所以有类似的东西:

    some-entry-point
          /\
         /  \
        /    \
       /      \
    fetchA   fetchB
      |         |
      |         |
    parseA   parseB
      \        /
       \      /
        \    /
         \  /
          \/
         join
          |
          |
         dump
    

    实现这一目标的正确和最新方法是什么?

    到目前为止我发现的是:

1 个答案:

答案 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)))

您还可以使用fetchparse函数概括此方法来获取和解析多个对象,使用pmap进行并行化:

(defn some-entry-point
  "Fetch and parse multiple objects in parallel"
  [objs]
  (->>  objs
        (pmap (comp parse fetch))
        (apply join)
        dump))