Я работаю над своим первым настоящим проектом в erlang, однако этот код упрощен для краткости. Я хочу иметь возможность загружать более новую версию файла в мой проект удаленно во время его работы. Я читал об использовании поведения, такого как gen_server
или gen_fsm
, у которого это бесплатно. Хотя это может привести к результату, я хочу использовать это, чтобы узнать, как это сделать, а не просто сделать это. Я читал документацию о замене кода и часть LYSE о любви к горячему коду , среди прочего, но я не смог найти ничего, что работало бы для того, что мне нужно. м делать, так что вот основная идея.
-module(reloading).
-export([loop/0]).
loop() ->
receive
upgrade ->
?MODULE:loop();
hello ->
io:format("This is a test~n"),
loop();
_ ->
loop()
end.
Я просто зацикливаюсь на идее, что я могу отправить сообщение upgrade
, и оно загрузит более новую версию кода.
$ erl
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.1 (abort with ^G)
1> c(reloading).
{ok,reloading}
2> Loop = spawn(reloading, loop, []).
<0.39.0>
3> Loop ! hello.
This is a test
hello
В этот момент я меняю 10 строку наio:format("I have changed this!~n"),
4> Loop ! upgrade.
upgrade
5> Loop ! hello.
This is a test
hello
Я ожидаю, что этот hello
вызов напечатает I have changed this!
, а не This is a test
. Я знаю, что могу просто позвонить c(reloading).
и все будет работать так, как ожидалось, но я хочу отправить фактическому проекту сообщение, а не обновлять код вручную. Так где же мой разрыв? Что я делаю неправильно, что я должен делать, чтобы загрузить этот код? Как упоминалось ранее, я ищу решение без -OTP в целях образования.