【问题标题】:Pmap inside a transducer in ClojureClojure 中的传感器内的 Pmap
【发布时间】:2017-09-06 15:58:57
【问题描述】:

我想在传感器中使用 pmap,如果我使用常规映射编写代码,它可以正常工作。但是,如果我使用 pmap 我会得到一个异常值。是否有可能在 clojure 中实现这一点,还是我做错了什么? 如果这是不可能的,有人可以指出为什么会发生这种情况的文档吗?只是出于好奇。下面粘贴的是我的代码和arity异常的开始。

(def get-in-map (comp
              (pmap read-csv)
              ))
clojure.lang.Compiler$CompilerException: clojure.lang.ArityException: Wrong number of args (1) passed to: core/pmap, compiling:

【问题讨论】:

    标签: clojure pmap transducer


    【解决方案1】:

    pmap 不支持使用它创建传感器。如果你仔细想想,这是有道理的。您从 pmap 与 map 获得的并行化打破了换能器的保证。它用过程的描述来完成一个并行的上下文。如here 所述,转换器将消费上下文与描述要完成的任务的代码分开。

    转换器的并行上下文的核心实现尚未实现:see this ticket。但是,您可以使用 core.async/pipeline 或 core.reducers/fold 自己创建一个。

    【讨论】:

      【解决方案2】:

      而 map 被记录为“[返回​​]一个传感器,当 没有提供集合,”(doc),pmap (doc) 不是这种情况。

      可以看到maphere的单参数版本的实现。如您所见here,pmap 没有一元版本,这就是您得到 ArityException 的原因。

      这就引出了一个问题:为什么没有一元 pmap?因为传感器可以以更通用的方式提供这种并行性。当你使用transducers时,不需要在每个操作中实现并行(map的并行版本等)。看看clojure.core.reducers/fold:它“使用(可能并行的)reduce-combine 策略来减少集合。”示例(来自 David Nolen):

      (clojure.core.reducers/fold + 
                                  ((map inc) +) 
                                  (vec (range 1000000)))
      

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 2015-11-06
        • 2013-11-26
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 2021-04-10
        相关资源
        最近更新 更多