Erlang 为什么可以';调用start\u child时,是否为\u one指定不同的子id?

Erlang 为什么可以';调用start\u child时,是否为\u one指定不同的子id?,erlang,child-process,erlang-supervisor,Erlang,Child Process,Erlang Supervisor,从: 请注意,当重启策略为简单的“一对一”时,子规范列表必须是仅包含一个子规范的列表。(忽略子规范标识符。)然后在初始化阶段不会启动任何子进程,但假定使用supervisor:start\u child/2动态启动所有子进程 零件的设计考虑是什么?它不会停止主动调用register(,ChildPid) 在每个子进程中。为子进程的PID注册名称与主管无关 考虑bog标准管理器(非动态),子规范通常通过调用child_module:start_link向管理器提供启动子规范所需的足够信息,但是ch

从:

请注意,当重启策略为简单的“一对一”时,子规范列表必须是仅包含一个子规范的列表。(忽略子规范标识符。)然后在初始化阶段不会启动任何子进程,但假定使用supervisor:start\u child/2动态启动所有子进程

零件的设计考虑是什么?它不会停止主动调用
register(,ChildPid)

在每个子进程中。

为子进程的PID注册名称与主管无关

考虑bog标准管理器(非动态),子规范通常通过调用child_module:start_link向管理器提供启动子规范所需的足够信息,但是child_module:start_link的实现决定了进程的启动方式以及可能的名称注册。典型的child_模块:start_链接实现类似于:

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。使用不同的子标识符将表示“这是一种不同类型的进程,与另一个不同”。这符合子规范是一个列表的要求。

生成的进程可以注册自身,但简单的“一个”用于_一种是创建大量相同的进程。您不会用C或Python之类的语言命名池中的工作线程——您倾向于简单地根据可用性将对它们的引用保留在一个队列或一对列表中。类似地,您也不会简单地用“一对一”来命名工作线程——相反,它们通常由任何其他(非主管)进程要求生成的子进程。它们可以注册自己,但这通常是不可取的。如果我在不同的时间创建相同类型的子进程,但需要区分哪些子进程为谁提供服务,该怎么办?请参阅我在另一个问题[链接]()我对你解释的最后一段感到困惑。使用孩子ID创建的其他类型的孩子是因为行为模式在较低的级别上起作用。在不同的时间创建相同类型的孩子很好。这对于简单的一对一来说很典型。在我看来,区分他们也很好,这可能有很多实际原因必要的,因为这些子项必须是出于某种原因创建的,它们可能有状态并且正在执行与其他进程相关的特定事件相关的任务,而且我相信有许多合法的情况会导致可能需要找到/跟踪它们的情况。如果任何一个子项崩溃都是真的没有比其他任何人更好/更差的地方,那就应该如此。我不太理解你的第二条评论,所以我只能尝试重新措辞。主管不负责命名子进程或为每个子进程提供/维护任何唯一标识符。如果我没记错的话,“主管”根本没有为其子进程保留唯一ID(除了PID之外)。每个子规范都有一个唯一的ID(称为子ID)。对于非动态管理器,这似乎是子进程本身的ID,因为每个ID只有一个进程,但实际上每个规范只有一个ID,每个规范有一个子进程。