Мы в Telegram
Добавить новость
103news.com
Работа
Ноябрь
2023

Исправить работу модуля в erlang и дополнить код

0
Необходимо исправить работу созданного erlang модуля, отвечающего за запуск и остановку процессов в eshell с различными именами. Модуль создавался согласно заданию. В приложениях сам erl файл и примерная схема работы модуля.

Текст задания:
  1. Создайте модуль keylist_mgr.erl.
    Создайте рекорд #state{children} который будет использоваться для сохранения состояния процесса. В #state.children будет храниться список кортежей {Name, Pid}.
Добавьте функцию loop/1 в модуль keylist_mgr.erl, которая:
  • на вход получает #state{};
  • ожидает сообщение;
  • обрабатывает сообщение;
  • отвечает на сообщение;
  • возвращается в состояние ожидания сообщения.

Возможные сообщения:

  • {From, start_child, Name} - Проверяет нет ли уже процесса с таким именем. Если нет то, стартует процесс {ok, Pid} = keylist:start_link(Name). Сохраняет {Name, Pid} в #state.children. Возвращает {ok, Pid} процессу From;
  • {From, stop_child, Name} - Проверяет есть ли уже процесс с таким именем. Если да то, останавливает процесс Name. Удаляет {Name, Pid} из #state.children. Возвращает результат процессу From;
  • stop - останавливает процесс;
  • {From, get_names} - Возвращает список имен из #state.children процессу From;
  • {'EXIT', Pid, Reason} - Залогируйте какой процесс завершился ошибкой.
Удалите процесс из #state.children.

Для работы с #state.children используйте модуль proplist.

Настройте trap_exit true. Мы можем изменить флаг для keylist_mgr с помощью process_flag(Flag, Value).


Пример кода:
loop(#state{children = Сhildren} = State) ->

receive

{From, start_child, Name} ->

%% Добавила новый элемент в список

%% Вернула результат

loop(NewState); %% Рекурсия

……

{'EXIT', Pid, Reason} ->

….

loop(NewState)

end.


2. Добавьте в keylist_mgr.erl функцию start/0.

start() ->



{ok, Pid, MonitorRef}.


В функции start/1:

  • Запустите процесс;
  • Зарегистрируйте его с именем ?MODULE;
  • Назначьте на него монитор;
  • В качестве результата верните Pid, MonitorRef.
Мы будем запускать 1 процесс keylist_mgr из Eshell. Который будет отвечать за запуск и остановку процессов keylist с различными именами.
Затем запускаем множество процессов keylist с различными именами.


Eshell:

Проверьте ваш pid (self/0).

Создайте keylist_mgr:

keylist_mgr:start().

Создайте 3 процесса keylist1, keylist2, keylist3

keylist_mgr ! {self(), start_child, keylist1}. - на этом моменте создании процесса возникает ошибка
3> keylist_mgr ! {self(), start_child, "keylist1"}.
{<0.85.0>,start_child,"keylist1"}
4> =ERROR REPORT==== 10-Nov-2023::19:00:43.921000 ===
Error in process <0.92.0> with exit value:
{undef,[{keylist,start_link,["keylist1"],[]},
{keylist_mgr,loop,1,[{file,"keylist_mgr.erl"},{line,15}]}]}

Отправьте сообщения процессу keylist3. С любыми данными типа {Key, Value, Comment}.

Протестируйте, что процесс keylist3 обрабатывает ваши сообщения, работает со списком и возвращает результат. Проверьте почтовый ящик вашего процесса (flush/0).

КОД МОДУЛЯ:
-module(keylist_mgr).
-export([start/0]).
-record(state, {
children = [] % Рекорд для хранения состояния процесса с полем children
}).

% Функция loop/1, обрабатывающая сообщения
loop(State) ->
receive
{From, start_child, Name} ->
% Проверка, нет ли уже процесса с таким именем
case proplists:get_value(Name, State#state.children) of
undefined ->
% Если процесса с таким именем нет, то стартуем новый
{ok, Pid} = keylist:start_link(Name),
% Добавляем новый процесс в список children
NewChildren = proplists:add(Name, Pid, State#state.children),
% Возвращаем Pid процесса вызывающему процессу
From ! {ok, Pid},
% Рекурсивный вызов loop с обновленным состоянием
loop(State#state{children = NewChildren});
_ ->
% Если процесс с таким именем уже существует, возвращаем ошибку
From ! {error, "Process with this name already exists"},
% Продолжаем ожидание новых сообщений
loop(State)
end;

{From, stop_child, Name} ->
% Проверка, существует ли процесс с таким именем
case proplists:get_value(Name, State#state.children) of
{Name, Pid} ->
% Если процесс существует, останавливаем его
ok = keylist:stop(Pid),
% Удаляем процесс из списка children
NewChildren = proplists:delete(Name, State#state.children),
% Возвращаем результат вызывающему процессу
From ! ok,
% Рекурсивный вызов loop с обновленным состоянием
loop(State#state{children = NewChildren});
undefined ->
% Если процесс с таким именем не существует, возвращаем ошибку
From ! {error, "Process with this name does not exist"},
% Продолжаем ожидание новых сообщений
loop(State)
end;

stop ->
% Останавливаем все процессы из списка children
lists:foreach(fun({_, Pid}) -> exit(Pid, normal) end, State#state.children),
% Возвращаем "ok"
ok;

{From, get_names} ->
% Получаем список имен из списка children
Names = proplists:get_keys(State#state.children),
% Возвращаем список вызывающему процессу
From ! Names,
% Рекурсивный вызов loop с обновленным состоянием
loop(State);

{'EXIT', Pid, Reason} ->
% Залогируем информацию о завершении процесса с ошибкой
io:format("Process ~p exited with reason: ~p~n", [Pid, Reason]),
% Удаляем процесс из списка children
NewChildren = proplists:delete_by_value(Pid, State#state.children),
% Рекурсивный вызов loop с обновленным состоянием
loop(State#state{children = NewChildren})
end.

% Функция для старта процесса
start() ->
process_flag(trap_exit, true),
Pid = spawn(fun() -> loop(#state{}) end),
register(?MODULE, Pid), % Регистрируем процесс с именем ?MODULE
MonitorRef = erlang:monitor(process, Pid), % Запускаем монитор
{ok, Pid, MonitorRef}. % Возвращаем Pid и MonitorRef





Губернаторы России
Москва

Неделя мэра: завод «Москвич», гранты для школ искусств и система городских вокзалов





Москва

Россия, Культура, Дети: конкурс на новую эмблему обьявил Театр Ульгэр в Республике Бурятия


Губернаторы России

103news.net – это самые свежие новости из регионов и со всего мира в прямом эфире 24 часа в сутки 7 дней в неделю на всех языках мира без цензуры и предвзятости редактора. Не новости делают нас, а мы – делаем новости. Наши новости опубликованы живыми людьми в формате онлайн. Вы всегда можете добавить свои новости сиюминутно – здесь и прочитать их тут же и – сейчас в России, в Украине и в мире по темам в режиме 24/7 ежесекундно. А теперь ещё - регионы, Крым, Москва и Россия.

Moscow.media
Москва

Сергей Собянин: в ТиНАО создадут новые управы районов



103news.comмеждународная интерактивная информационная сеть (ежеминутные новости с ежедневным интелектуальным архивом). Только у нас — все главные новости дня без политической цензуры. "103 Новости" — абсолютно все точки зрения, трезвая аналитика, цивилизованные споры и обсуждения без взаимных обвинений и оскорблений. Помните, что не у всех точка зрения совпадает с Вашей. Уважайте мнение других, даже если Вы отстаиваете свой взгляд и свою позицию. 103news.com — облегчённая версия старейшего обозревателя новостей 123ru.net.

Мы не навязываем Вам своё видение, мы даём Вам объективный срез событий дня без цензуры и без купюр. Новости, какие они есть — онлайн (с поминутным архивом по всем городам и регионам России, Украины, Белоруссии и Абхазии).

103news.com — живые новости в прямом эфире!

В любую минуту Вы можете добавить свою новость мгновенно — здесь.

Музыкальные новости

Джиган

Улитки на обед, номер за полмиллиона с видом на Эйфелеву башню: отпуск мечты Самойловой и Джигана в Париже




Спорт в России и мире

Алексей Смирнов – актер, которого, надеюсь, еще не забыли

Стартовал финальный этап всероссийского футбольного турнира «Будущее зависит от тебя»

В Подмосковье сотрудники ОМОН «Русич» Росгвардии приняли участие в церемонии открытия соревнований по дзюдо среди детей и подростков

В ЦСКА рассказали о тяжести травмы голкипера Владислава Торопа


Даниил Медведев

Даниил Медведев одолел 121-ю ракетку мира Меджедовича и вышел в 1/8 финала Рима



Новости Крыма на Sevpoisk.ru


News Every Day

Rory McIlroy masterclass secures dominant five-shot victory at Wells Fargo Championship



Частные объявления в Вашем городе, в Вашем регионе и в России