陷阱退出时关闭的正确方法是什么?

时间:2018-04-04 19:15:22

标签: erlang

我有一个gen_server,用

跟踪出口
%% worker.erl
% ...
init(args) ->
  process_flag(trap_exit, true)
  % ...

handle_info({'EXIT', SpecialPid, Reason}, SpecialPid) ->
  % terminate
  exit(normal);
handle_info({'EXIT', _NormalPid, _Reason}, SpecialPid) ->
  % ignore     
  {noreply, SpecialPid}.

我希望能够关闭此gen_server上的监督树:

%% sup_sup.erl
% ...
  supervisor:terminate_child(self(), worker_sup),
% ...

当我跑步时,我可以终止工人。但是,我得到OTP错误,好像进程终止是意外的。我还尝试exit(normal)并返回{stop, normal, State}{stop, shutdown, State},这些都会产生相同的效果。

在关机期间模拟OTP行为的正确方法是什么,而在其他情况下仍然会捕获退出?

1 个答案:

答案 0 :(得分:0)

您只需要从{stop, normal, State)返回handle_info/2即可。您可能仍会收到来自主管的信息/错误消息,具体取决于您在此过程中使用的子规范。

如果您希望自己的流程在完成工作后停止而不重新启动,则应在子规范中使用restart => transient。这样,如果进程以正常情况下的任何其他原因退出,则将重新启动该进程。但是在使用{stop, normal, State}时,您不应该收到任何消息。