一旦pmap在Clojure中完成,你如何调用函数?

时间:2016-10-05 06:02:28

标签: clojure parallel-processing

在Clojure中,如何在处理集合中的所有项目时运行pmap等方法并调用函数?

2 个答案:

答案 0 :(得分:2)

你可以将它包装在一个函数中,这将强制执行映射并在此之后调用一些回调函数:

user> (defn pmap-callback [callback f & colls]
        (let [res (doall (apply pmap f colls))]
          (callback res)
          res))
#'user/pmap-callback

user> (pmap-callback #(println "complete!" %)
                     + [1 2 3] [4 5 6])
;;=> complete! (5 7 9)
(5 7 9)

答案 1 :(得分:2)

来自pmap doc string:

  

与地图类似,除了f并行应用。半懒在那   并行计算保持在消费之前,但并非如此   除非需要,否则实现整个结果。只对有用   计算密集型函数,其中f的时间占主导地位   协调开销。

因此,pmap结果不会被完全计算,直到您要求结果序列的所有元素为止。与其他惰性序列一样,您可以使用doall(如果需要保留整个评估的序列内容)或dorun强制完全实现延迟序列(如果您只对由此产生的副作用感兴趣)你的映射函数并不需要评估的序列。)

要在计算完所有结果后执行某项功能,您可以在调用dorundoall后直接调用该功能。

还值得注意的是,pmap不是调度异步并行作业的工具,您可以在处理完成时收到通知。对于此类用例,Clojure core.async可能是更好的选择。