3

我想在传感器中使用 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:
4

2 回答 2

5

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

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

于 2017-09-06T16:23:55.867 回答
1

尽管map记录为“在未提供集合时 [返回] 转换器”(docpmap ),但(doc)并非如此。

map 您可以在此处查看单参数版本的实现。正如您在此处看到的,pmap没有一元版本,这就是您得到 ArityException 的原因。

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

(clojure.core.reducers/fold + 
                            ((map inc) +) 
                            (vec (range 1000000)))
于 2017-09-06T16:13:05.247 回答