在子终止时不调用自定义unregister_name / 2

时间:2013-07-10 21:33:29

标签: erlang otp

我有一位simple_one_for_one主管正在监视一群主管,其子规格类似于

init([]) ->                                                                                                                                                                                
    {ok, {{simple_one_for_one, 60, 5},                                                                                                                                                                      
          [{subsup, {subsup, start_link, []},                                                                                                                                        
            permanent, infinity, supervisor, dynamic}]}}.  

我的start_child func看起来像这样:

start_subsup(Name) ->
    SupName = {via, ?MODULE, Name},
    supervisor:start_child(?MODULE, [SupName]).

以下是重要部分:我正在注册via ?MODULE - 我已正确实施register_name/2unregister_name/1whereis_name/1和{ {1}}(由ets表支持)。如有必要,我也可以发布该代码。

我孩子的start_link函数看起来像这样:

send/2

好吧,一旦一切都运转起来,就会发生以下情况:

start_link(SupName) ->
    supervisor:start_link(SupName, ?MODULE, []).

我设置了所有这些,以便我可以让孩子主管死亡并重新开始,但是它被未被注册的名称阻止。

提前致谢!

2 个答案:

答案 0 :(得分:1)

这是因为您没有正确实现语义。仅在初始化时调用unregister_name/2以打破可能的竞争条件。否则,假设您的ETS模块在注册名称上设置监视器,以便在进程终止时自动删除该名称。

gproc查看已经完成并且比您更精确的解决方案。

答案 1 :(得分:0)

您需要为已停止的子节点捕获退出信号以运行终止。在您的子流程init

中调用此方法
process_flag(trap_exit, true)
相关问题