来自doc:
请注意,当重启策略为simple_one_for_one时,子规范列表必须是仅包含一个子规范的列表。 (忽略子规范标识符。)在初始化阶段不会启动子进程,但假定所有子进程都是使用supervisor动态启动的:start_child / 2。
该部件的设计考虑因素是什么?它不会停止主动呼叫register(<chid_id>, ChildPid)
在每个子进程中。
答案 0 :(得分:3)
为子进程的PID注册名称与主管没有任何关系。
考虑一个bog标准管理程序(非动态),子规范通过调用child_module:start_link为监督者提供足够的信息来启动子进程,但是它是child_module:start_link的实现,它决定了进程的启动方式并可能是名称注册。典型的child_module:start_link实现类似于:
start_link() ->
gen_server:start_link({local, server_name}, ?MODULE, [], []).
这是对gen_server:start_link / 4的调用,它导致生成的gen_server进程注册PID名称为'server_name'。
您可以调用gen_server:start_link / 3,在这种情况下gen_server进程没有名称,除非您在init / 1行为实现中调用erlang:register / 2或类似的东西。
这很好,因为没有理由将名称注册与监督联系起来,模块/进程的名称是关于该模块及其服务,如何访问和使用,而不是监督策略。
受监督的流程为自己注册名称是很常见的,因此成为任何其他流程都可以轻松访问的命名服务。
然而,对于简单的一对一监督,通常受监督的孩子不会有姓名,因为他们应该是同质的(即不要创建一个简单的一对一监督员,动态地启动各种工作人员,如果他们这样做不同的东西,然后他们几乎肯定有不同的相对重要性,他们应该在不同的主管下),因此,唯一的名称是没有用的/适当的。
在调用start_child时你不能选择不同的子标识符的原因是,子标识符实际上是子规范的ID(即子类型),而不是子进程的ID,无论如何因此。使用不同的子标识符会说'这是一种不同类型的过程,它做了与另一个不同的过程'。这符合子规范是一个列表的要求。