0

这是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. 为什么 application master 在收到 {Parent, terminate} 和 {'EXIT', Parent, Reason} 时的行为不同?

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

4

1 回答 1

1

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

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

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

于 2013-08-02T08:13:13.673 回答