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
如何在Clojure中执行同步并行功能?_Clojure_Parallel Processing - Fatal编程技术网

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

如何在Clojure中执行同步并行功能?,clojure,parallel-processing,Clojure,Parallel Processing,我有一个应用程序,它有一个可以并行完成的初始流程: 获取两个JSON文档(我用它) 解析这些文档(仅提取所需数据) 加入结果 将它们转储到一个文件中 所以有点像这样: some-entry-point /\ / \ / \ / \ fetchA fetchB | | | | parseA parseB \ / \ / \ / \ /

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

  • 获取两个JSON文档(我用它)
  • 解析这些文档(仅提取所需数据)
  • 加入结果
  • 将它们转储到一个文件中
  • 所以有点像这样:

    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将不会关闭。