首页 > 解决方案 > 在 Erlang 热代码重载功能中触发更新消息

问题描述

我正在按照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}.

>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

标签: erlangmonitorhot-code-replace

解决方案


该进程期望将原子update作为消息获取。由于变量中有进程的 pid,因此U您可以像这样发送消息:

U ! update.

请注意,字符串Even versionUneven version仅保留在状态中,从不打印,因此您不会看到这些。您唯一会看到的是退出消息,发送update四次并调用flush().


推荐阅读