私は erlang で最初の実際のプロジェクトに取り組んでいますが、このコードは簡潔にするために単純化されています。プロジェクトの実行中に、新しいバージョンのファイルをプロジェクトにリモートでロードできるようにしたいと考えています。gen_server
またはのような動作を無料で使用することについて読んだことがgen_fsm
あります。それは結果を達成するかもしれませんが、私はこれを使ってそれを成し遂げるだけでなく、それを行う方法を学びたいと思っています. 私はコード置換に関するドキュメントや、LYSE のHot Code Lovingに関するビットなどを読みましたが、私がやっていることのために機能するものを見つけることができなかったので、ここに基本的な考え方があります。
-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
この呼び出しが print I have changed this!
notになることを期待していThis is a test
ます。単純に呼び出しc(reloading).
て、これを期待どおりに動作させることができることはわかっていますが、コードを手動で更新するのではなく、実際のプロジェクトにメッセージを送信したいと考えています。それで、私の切断はどこですか?このコードをホットロードするために何をすべきでしょうか? 前に述べたように、私は教育のために OTP 以外のソリューションを探しています。