我正在进行我的第一个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(Open Telecom Platform,已停止开发)的解决方案。
c(重新加载),l(重新加载)。
- Muzaaya Joshuac(reloading)
,但在实际项目中我不想使用erl
。 - joneshf