Substituição de código quente em erlang
Eu estou trabalhando no meu primeiro projeto real em erlang, no entanto, este código é simplificado por brevidade. Eu quero ser capaz de carregar uma versão mais recente de um arquivo no meu projetoremotamente enquanto está correndo. Eu li sobre o uso de um comportamento comogen_server
ougen_fsm
que tem isso de graça. Embora isso possa alcançar o resultado, quero usá-lo para aprender como fazê-lo, e não apenas fazê-lo. Eu li os docs sobresubstituição de códigoe pouco da LYSE sobreCódigo quente amorosoentre outras coisas, mas não consegui encontrar nada que funcione para o que estou fazendo, então aqui está a ideia básica.
-module(reloading).
-export([loop/0]).
loop() ->
receive
upgrade ->
?MODULE:loop();
hello ->
io:format("This is a test~n"),
loop();
_ ->
loop()
end.
Estou simplesmente dando voltas com a ideia de que posso enviar a mensagemupgrade
e carregará uma versão mais nova do código.
$ 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
Neste ponto eu mudo 10 linhas paraio:format("I have changed this!~n"),
4> Loop ! upgrade.
upgrade
5> Loop ! hello.
This is a test
hello
Eu estou esperando issohello
ligue para imprimirI have changed this!
nãoThis is a test
. Eu sei que posso simplesmente ligarc(reloading).
e ter esse trabalho da maneira esperada, mas estou tentando enviar ao projeto uma mensagem em vez de atualizar manualmente o código. Então, onde está minha desconexão? O que estou fazendo de errado, que eu deveria estar fazendo para carregar este código? Como mencionado anteriormente, estou procurando uma solução não-OTP em prol da educação.