(pmap f coll) (pmap f coll & colls)
Like map, except f is applied in parallel. Semi-lazy in that the parallel computation stays ahead of the consumption, but doesn't realize the entire result unless required. Only useful for computationally intensive functions where the time of f dominates the coordination overhead.
;; This function operates just like map. See
;; clojure.core/map for more details.
user=> (pmap inc [1 2 3 4 5])
(2 3 4 5 6)
;; A function that simulates a long-running process by calling Thread/sleep:
(defn long-running-job [n]
(Thread/sleep 3000) ; wait for 3 seconds
(+ n 10))
;; Use `doall` to eagerly evaluate `map`, which evaluates lazily by default.
;; With `map`, the total elapsed time is just under 4 * 3 seconds:
user=> (time (doall (map long-running-job (range 4))))
"Elapsed time: 11999.235098 msecs"
(10 11 12 13)
;; With `pmap`, the total elapsed time is just over 3 seconds:
user=> (time (doall (pmap long-running-job (range 4))))
"Elapsed time: 3200.001117 msecs"
(10 11 12 13)
;; pmap is implemented using Clojure futures. See examples for 'future'
;; for discussion of an undesirable 1-minute wait that can occur before
;; your standalone Clojure program exits if you do not use shutdown-agents.