Skip to content
Erlang

rpc:pmap으로 병렬 맵

프로세스 간에 리스트 각 요소에 병렬로 함수를 적용한다.

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