Skip to content
Erlang

Mapa paralelo com rpc:pmap

Aplica uma função a cada elemento de lista em paralelo entre processos.

#parallel#pmap#list

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 ]).