Code
erlang
% Built-in: rpc:pmap(NodeList, Fun, List)
% Local-only shortcut: rpc:pmap({erlang, node}, Fun, List) or
% a simple hand-rolled version:
pmap(Fun, List) ->
Parent = self(),
N = length(List),
% spawn one process per element
Pids = [ spawn(fun() ->
Result = (catch Fun(X)),
Parent ! {self(), Result}
end) || X <- List ],
% collect results in order
[ receive {P, R} -> R end || P <- Pids ].
% Usage: pmap(fun(X) -> timer:sleep(1000), X*2 end, [1,2,3,4]).
% Takes ~1 second total instead of ~4 seconds.
% For bounded parallelism, partition the list and use a worker pool:
pmap_n(Fun, List, N) ->
Parent = self(),
Chunks = chunk(N, List),
[ spawn(fun() -> Parent ! {self(), [Fun(X) || X <- C]} end) || C <- Chunks ],
lists:append([ receive {P, R} -> R end || _ <- Chunks ]).