我有一位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/2
,unregister_name/1
,whereis_name/1
和{ {1}}(由ets表支持)。如有必要,我也可以发布该代码。
我孩子的start_link函数看起来像这样:
send/2
好吧,一旦一切都运转起来,就会发生以下情况:
start_link(SupName) ->
supervisor:start_link(SupName, ?MODULE, []).
我设置了所有这些,以便我可以让孩子主管死亡并重新开始,但是它被未被注册的名称阻止。
提前致谢!
答案 0 :(得分:1)
这是因为您没有正确实现语义。仅在初始化时调用unregister_name/2
以打破可能的竞争条件。否则,假设您的ETS模块在注册名称上设置监视器,以便在进程终止时自动删除该名称。
请gproc
查看已经完成并且比您更精确的解决方案。
答案 1 :(得分:0)
您需要为已停止的子节点捕获退出信号以运行终止。在您的子流程init
:
process_flag(trap_exit, true)