在 Erlang 热代码重载功能中触发更新消息
Triggering the update message in Erlang hot code reload feature
我正在按照 LYAE 的指南尝试 erlang 的热代码功能,但我不明白如何触发 update
消息。
我有一个运行可升级方法的模块:
模块
-module(upgrade).
-export([main/1,upgrade/1,init/1,init_link/1]).
-record(state,{ version=0,comments=""}).
init(State)->
spawn(?MODULE,main,[State]).
main(State)->
receive
update->
NewState=?MODULE:upgrade(State),
if NewState#state.version>3 -> exit("Max Version Reached") end,
?MODULE:main(NewState);
SomeMessage->
main(State)
end.
upgrade(State=#state{version=Version,comments=Comments})->
Comm=case Version rem 2 of
0 -> "Even version";
_ -> "Uneven version"
end,
#state{version=Version+1,comments=Comm}.
Shell
>c(upgrade).
>rr(upgrade,state).
>U=upgrade:init(#state{version=0,comments="initial"}).
>Monitor=monitor(process,U).
> ......to something to trigger the update message
> flush(). % see the exit message reason
我不明白如何执行热代码重新加载以触发 update
消息。
我想在使用 flush
时从我的 main
方法中获取退出原因。
进程期望获取原子 update
作为消息。由于您在变量 U
中有进程的 pid,您可以像这样发送消息:
U ! update.
请注意,字符串 Even version
和 Uneven version
仅保留在状态中,从不打印,因此您不会看到它们。在发送 update
四次并调用 flush()
.
之后,您唯一会看到的是退出消息
我正在按照 LYAE 的指南尝试 erlang 的热代码功能,但我不明白如何触发 update
消息。
我有一个运行可升级方法的模块:
模块
-module(upgrade).
-export([main/1,upgrade/1,init/1,init_link/1]).
-record(state,{ version=0,comments=""}).
init(State)->
spawn(?MODULE,main,[State]).
main(State)->
receive
update->
NewState=?MODULE:upgrade(State),
if NewState#state.version>3 -> exit("Max Version Reached") end,
?MODULE:main(NewState);
SomeMessage->
main(State)
end.
upgrade(State=#state{version=Version,comments=Comments})->
Comm=case Version rem 2 of
0 -> "Even version";
_ -> "Uneven version"
end,
#state{version=Version+1,comments=Comm}.
Shell
>c(upgrade).
>rr(upgrade,state).
>U=upgrade:init(#state{version=0,comments="initial"}).
>Monitor=monitor(process,U).
> ......to something to trigger the update message
> flush(). % see the exit message reason
我不明白如何执行热代码重新加载以触发 update
消息。
我想在使用 flush
时从我的 main
方法中获取退出原因。
进程期望获取原子 update
作为消息。由于您在变量 U
中有进程的 pid,您可以像这样发送消息:
U ! update.
请注意,字符串 Even version
和 Uneven version
仅保留在状态中,从不打印,因此您不会看到它们。在发送 update
四次并调用 flush()
.