【问题标题】:Erlang's FSM code_change function usageErlang的FSM code_change函数用法
【发布时间】:2015-12-10 18:12:04
【问题描述】:

我正在学习 Erlang,我已经了解了热代码加载,但我不知道 gen_fst 行为的 code_change 函数是如何工作的。我也找不到任何例子。

我应该像这样创建一个动作吗:

upgrade() ->
    gen_fsm:send_event(machine_name, upgrade).

并且在这样的状态下有一个处理程序:

some_state(upgrade, State) ->
    code:purge(?MODULE),
    compile:file(?MODULE),
    code:load_file(?MODULE),
    {next_state, some_state, State, 1000}.

我已经尝试过了,但是 code_change/4 函数没有执行。我应该如何在我的 FSM 中正确实现热代码加载?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    code_change 函数调用由主管在执行 relup 时编排。正常的热代码加载是为此所需的低级功能。

    如果您只想更换一个模块并且不需要升级您的状态,您通常可以从 shell 加载新模块(不需要清除,它实际上可能是有害的)。

    每个模块最多运行两个版本。进行本地调用时(调用中没有模块名称),您将保留在旧版本中。但是,当您进行合格的调用(使用模块名称)时,您将始终跳转到新代码。

    loop(S) ->
       do_processing(S),   % stays in the same version
       ?MODULE:loop(S).    % always jumps to the newest version
    

    对于更复杂的热升级你需要appups和relups,这是一个高级主题,最好的介绍是in LYSE

    【讨论】:

    • 您的回答非常有见地。我实际上正在关注您链接但尚未到达该部分的书,因此我感到困惑。感谢您消除了我的困惑。
    猜你喜欢
    • 2020-04-05
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2021-04-28
    • 2018-09-13
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多