我有一个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行为的正确方法是什么,而在其他情况下仍然会捕获退出?
答案 0 :(得分:0)
您只需要从{stop, normal, State)
返回handle_info/2
即可。您可能仍会收到来自主管的信息/错误消息,具体取决于您在此过程中使用的子规范。
如果您希望自己的流程在完成工作后停止而不重新启动,则应在子规范中使用restart => transient
。这样,如果进程以正常情况下的任何其他原因退出,则将重新启动该进程。但是在使用{stop, normal, State}
时,您不应该收到任何消息。