在Clojure中的传感器内部进行Pmap

时间:2017-09-06 15:58:57

标签: clojure pmap transducer

我想在传感器中使用pmap,如果我使用常规地图编写代码,它可以正常工作。但是,如果我使用pmap,我会得到一个arity异常。是否有可能在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:

2 个答案:

答案 0 :(得分:4)

pmap不支持使用它创建传感器。如果你考虑一下,这是有道理的。从pmap vs map获得的并行化打破了传感器的保证。它通过对过程的描述来完善并行上下文。如上所述,here传感器将消费环境与描述要完成的任务的代码分开。

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

答案 1 :(得分:1)

map被记录为“[返回​​]换能器 没有提供任何集合,“(doc),pmapdoc)并非如此。

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

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

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