我想在传感器中使用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:
答案 0 :(得分:4)
pmap不支持使用它创建传感器。如果你考虑一下,这是有道理的。从pmap vs map获得的并行化打破了传感器的保证。它通过对过程的描述来完善并行上下文。如上所述,here传感器将消费环境与描述要完成的任务的代码分开。
传感器并行上下文的核心实现尚未实现:see this ticket。但是,您可以使用core.async / pipeline或core.reducers / fold来自己创建一个。
答案 1 :(得分:1)
而map
被记录为“[返回]换能器
没有提供任何集合,“(doc),pmap
(doc)并非如此。
您可以看到map
here的单参数版本的实现。如您所见here,pmap
没有一元版本,这就是您获得ArityException的原因。
这引出了一个问题:为什么没有一元pmap
?因为换能器可以以更一般的方式提供并行性。使用传感器时,无需在每个操作中实现并行性(map
的并行版本等)。看看clojure.core.reducers/fold
:它“使用(可能是并行的)降低合并策略来减少收集。”示例(来自David Nolen):
(clojure.core.reducers/fold +
((map inc) +)
(vec (range 1000000)))