Erlang 为什么在GenServer中启动监控器会导致进程重启行为出现问题?
正如问题的标题所述: 为什么在GenServer中启动监控器会导致进程重启行为出现问题 我发现一个讨论陈述了以下内容: 具体而言:Erlang 为什么在GenServer中启动监控器会导致进程重启行为出现问题?,erlang,elixir,otp,Erlang,Elixir,Otp,正如问题的标题所述: 为什么在GenServer中启动监控器会导致进程重启行为出现问题 我发现一个讨论陈述了以下内容: 具体而言: “监管树提供的担保较少,因为流程可能会退出,并且监管人不会终止其子进程。” “如果命名了supervisors子级,这可能会导致问题,因为在树的较高位置(在其init/1中调用start_链接的进程上方)重新启动时,命名的子级可能仍然存在。” 当通过遍历监督树发现流程模块时,您会丢失一些高级OTP功能,如代码重新加载 根本原因是什么?这在总体上是正确的吗
- “监管树提供的担保较少,因为流程可能会退出,并且监管人不会终止其子进程。”
- “如果命名了supervisors子级,这可能会导致问题,因为在树的较高位置(在其init/1中调用start_链接的进程上方)重新启动时,命名的子级可能仍然存在。”
- 当通过遍历监督树发现流程模块时,您会丢失一些高级OTP功能,如代码重新加载
gen_服务器
本身,其唯一目的是以标准方式监视/重新启动他们的孩子并终止他们/死亡。如果你创建了一个gen_服务器
,产生了一个主管,这意味着你在该级别上做了一些事情,而一个普通的主管没有做出决定
让我们考虑这个OTP场景:
P1 - Parent supervisor
|
G1 - GenServer
|
S1 - Children supervisor
|
C1 - Children worker
主管在终止自己之前等待其所有子服务器退出,如果您的gen_服务器作为主管(G1)在其所有子服务器(S1)终止之前由于某种原因死亡,则父服务器可以重新启动gen_服务器
(G1')。此服务器将产生S1',而反过来,将产生C1'
突然之间,S1和C1的几个实例同时运行,这很可能是一个问题
关于提到的代码重新加载问题,这意味着code\u changed
回调树触发器将在G1处停止(因为G1不会将其传播到S1),而不是代码不会被加载
TL;DR:
监督员是非常专业的,代码> GeNoServer 。如果在监管树的中间放置一个常规的<代码> GeNoServer < /C>,而不提供监督者提供的所有保证,则在该子树中会丢失一些OTP特征。