Я смотрю, как писать сценарии типа «сокращение карты» непосредственно в erlang. В качестве примера игрушек, представьте, что я хочу решить, какой из нескольких файлов является самым большим. Эти файлы могут быть в любом месте в Интернете, поэтому получение каждого из них может занять некоторое время; поэтому я хотел бы собрать их параллельно. Как только у меня есть все, я могу сравнить их размеры.идиоматическая синхронизация процесса в Erlang
Мой принятый подход заключается в следующем: «» основной процесс
- А до координировать работу и определять, который является самым большим;
- «Рабочий» процесс для каждого файла, который извлекает файл и возвращает размер основного процесса.
Вот неуклюжим, но функционирующий пример (используя только локальные файлы, но это показывает намерение):
-module(cmp).
-export([cmp/2]).
cmp(Fname1, Fname2) ->
Pid1 = fsize(Fname1),
Pid2 = fsize(Fname2),
{Size1, Size2} = collect(Pid1, Pid2),
if
Size1 > Size2 ->
io:format("The first file is bigger~n");
Size2 > Size1 ->
io:format("The second file is bigger~n");
true ->
io:format("The files are the same size~n")
end.
fsize(Fname) ->
Pid = spawn(?MODULE, fsize, [self(), Fname]),
Pid.
fsize(Sender, Fname) ->
Size = filelib:file_size(Fname),
Sender ! {self(), Fname, Size}.
collect(Pid1, Pid2) ->
receive
{Pida, Fnamea, Sizea} ->
io:format("Pid: ~p, Fname: ~p, Size: ~p~n", [Pida, Fnamea, Sizea])
end,
receive
{Pidb, Fnameb, Sizeb} ->
io:format("Pid: ~p, Fname: ~p, Size: ~p~n", [Pidb, Fnameb, Sizeb])
end,
if
Pida =:= Pid1 -> {Sizea, Sizeb};
Pida =:= Pid2 -> {Sizeb, Sizea}
end.
Конкретные вопросы
- ли подход идиоматических? т. е. отнимать каждую «длинную» задачу в отдельный процесс, а затем собирать результаты обратно в «мастер»?
- Есть ли библиотека для обработки механики синхронизации? В частности, функция
collect
в примере выше?
Спасибо.
- Примечание: Я знаю, что функция collect
неудобна; его можно обобщить, например, сохранение pids в списке и цикл до тех пор, пока все не завершится.
спасибо - намного более элегантная реализация, а также проверяет идиому «многих работников». – sfinnie