【问题标题】:Excess code after exit/1 in the source code of application_master.erlapplication_master.erl源码中exit/1后多余代码
【发布时间】:2013-08-02 16:13:13
【问题描述】:

这是application master的部分源代码,它是管理erlang应用程序的模块。

348 loop_it(Parent, Child, Mod, AppState) ->
349     receive
350         {Parent, get_child} ->
351             Parent ! {self(), Child, Mod},
352             loop_it(Parent, Child, Mod, AppState);
353         {Parent, terminate} ->
354             NewAppState = prep_stop(Mod, AppState),
355             exit(Child, shutdown),
356             receive
357                 {'EXIT', Child, _} -> ok
358             end,
359             catch Mod:stop(NewAppState),
360             exit(normal);
361         {'EXIT', Parent, Reason} ->
362             NewAppState = prep_stop(Mod, AppState),
363             exit(Child, Reason),
364             receive
365                 {'EXIT', Child, Reason2} ->
366                     exit(Reason2)
367             end,
368             catch Mod:stop(NewAppState);
369         {'EXIT', Child, Reason} -> % forward *all* exit reasons (inc. normal)
370             NewAppState = prep_stop(Mod, AppState),
371             catch Mod:stop(NewAppState),
372             exit(Reason);
373         _ ->
374             loop_it(Parent, Child, Mod, AppState)
375     end.

我的问题是:

  1. 为什么应用主控收到{Parent, terminate}和{'EXIT', Parent, Reason}时的行为不同?

  2. 第 368 行中的代码是什么意思?应用程序主机必须在 第 366 行之前退出。

【问题讨论】:

    标签: erlang erlang-otp


    【解决方案1】:

    应用程序主机在进行受控关闭或重新启动时收到“终止”。当它收到任何退出信号时,它会不受控制地关闭。

    gen_servers, supervisors, etc 如果发生不受控制的关闭,则记录到错误记录器,如果它受到控制,则不会发出错误报告。

    第 368 行的代码看起来像是复制粘贴错误。该行将永远不会执行。

    【讨论】:

    • erlang源代码复制粘贴错误...我是从www.erlang.org下载的。 =_=
    • 但是为什么只有当application master收到{'EXIT', Parent, Reason}时,它才调用Mod:stop/1呢?我们是否应该像其他条件一样在 exit(Reason) 之前移动 368 行?
    • 如果应用程序主控从其父级退出,那么系统中出现了严重错误,所以我想此时没有调用停止以加速节点的关闭。跨度>
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2019-07-31
    • 2019-10-03
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多