在Clojure中,如何在处理集合中的所有项目时运行pmap等方法并调用函数?
答案 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
强制完全实现延迟序列(如果您只对由此产生的副作用感兴趣)你的映射函数并不需要评估的序列。)
要在计算完所有结果后执行某项功能,您可以在调用dorun
或doall
后直接调用该功能。
还值得注意的是,pmap
不是调度异步并行作业的工具,您可以在处理完成时收到通知。对于此类用例,Clojure core.async可能是更好的选择。