在 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 versionUneven version 仅保留在状态中,从不打印,因此您不会看到它们。在发送 update 四次并调用 flush().

之后,您唯一会看到的是退出消息