Skip to content

Instantly share code, notes, and snippets.

@darkf
Created August 30, 2012 20:18
Show Gist options
  • Select an option

  • Save darkf/3539854 to your computer and use it in GitHub Desktop.

Select an option

Save darkf/3539854 to your computer and use it in GitHub Desktop.
Bisect parallel factorial in Erlang
-module(prog).
-export([fact/2, worker/3, manager/1, main/0]).
fact(N, Start) -> lists:foldl(fun(L, R) -> L*R end, 1, lists:seq(Start, N)).
worker({Start, End}, I, Pid) ->
R = fact(End, Start),
Pid ! {finished, I, R}.
manager(Queue) ->
receive
{finished, I, Result} ->
io:format("worker ~p finished with ~p~n", [I, Result]),
if length(Queue) == 0 -> manager([Result]);
true ->
R = hd(Queue) * Result, %% final computation
io:format("done. result: ~p~n", [R])
end
end.
main() ->
N = 10,
{M1, M2} = {{1, N div 2}, {N div 2 + 1, N}}, %% two processes
M = spawn(prog, manager, [[]]),
spawn(prog, worker, [M1, 1, M]),
spawn(prog, worker, [M2, 2, M]).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment