问题描述
问题标题指出:
为什么在GenServer中启动Supervisor会导致进程重启行为出现问题?
特别是:
根本原因是什么?总的来说这是否成立?
参考文献
解决方法
OTP(监督树)是建立在BEAM功能之上的,例如监视,链接,信号和捕获它们。
主管本身就是gen_servers
,其唯一目的是监视/重新启动其孩子并以标准方式终止他们/使其死亡。如果您创建一个gen_server
来产生主管,则意味着您处于该级别,而普通主管没有晋级。
让我们考虑一下这种OTP场景:
P1 - Parent supervisor
|
G1 - GenServer
|
S1 - Children supervisor
|
C1 - Children worker
如果您有gen_server
的监护人(G1)在所有孩子(S1)都终止之前因某种原因去世,则监护人会等待所有孩子退出后再终止自身生活重新启动gen_server
(G1')。这将产生S1',然后产生S1'。
突然之间有多个S1和C1实例同时运行,这很可能是个问题。
关于上述代码重新加载问题,这意味着code_changed
回调树触发器将在G1处停止(因为G1不会将其传播到S1),而不是不会加载代码。
TL; DR:
主管非常专业gen_servers
。如果将常规gen_server
放在监管树的中间而没有提供监管者提供的所有保证,则会丢失该子树中的一些OTP功能。