Я прохожу через «Программирование Эрланга» Чезарини и Томпсона (О'Рейли), и я принял решение 4-2, но после игры с ним есть две проблемы:
Каждый раз, когда я запускаю go / 3, «werl.exe» в windows жует X объем ОЗУ. Каждый последующий звонок занимает одну и ту же сумму и никогда не возвращается.
Если я запускаю go (Message, 10000,10), он съедает 1,4 ГБ ОЗУ и вылетает
Я думал, что во втором случае Эрланг должен справиться с этим без проблем из того, что я читал, поэтому я предполагаю, что я как-то ввел утечку памяти? Я читаю разделы об утечках памяти и хвостовой рекурсии и не вижу, что я делаю неправильно.
Заранее спасибо.
-module(processRing).
-export([waitMessage/0,go/3]).
% Spawn M processes and pass Message around to each process N times
go(Message,M,N) ->
ProcList = buildList(M),
[H | T ] = ProcList,
register(firstProc,H),
H ! {self(), T, ProcList, Message, N}.
waitMessage() ->
receive
{_, _, _, _, 0} ->
io:format("end!", []);
{From, [H|T], AllProcs, Message, N} ->
%io:format("~w:~w from:~w~n n=~w",[self(),Message,From,N]),
H ! {self(), T, AllProcs, Message, N},
waitMessage();
{From, [], AllProcs, Message, N} ->
io:format("~w:~w (Last in list) from:~w n=~w~n",[self(),Message,From,N]),
firstProc ! {self(), AllProcs, AllProcs, Message, N - 1},
waitMessage();
Other ->
io:format("other:~w~n",[Other])
end.
buildList(N) when N > 0 ->
[spawn(processRing,waitMessage,[]) | buildList(N - 1)];
buildList(0) ->
[].