Clojure 中传感器内的 Pmap

Pmap inside a transducer in Clojure

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

map 被记录为“[return] 一个换能器,当 没有提供集合,"(doc), that is not the case for pmap (doc).

你可以看到maphere. As you see here的单参数版本的实现,pmap没有一元版本,所以这就是你得到ArityException的原因。

这就引出了一个问题:为什么没有一元 pmap?因为换能器可以以更通用的方式提供这种并行性。使用 transducer 时,无需在每个操作中实现并行(map 的并行版本等)。看看 clojure.core.reducers/fold:它 "reduces a colletion using a (potentially parallel) reduce-combine strategy." 示例(来自 David Nolen):

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

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

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