Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 为什么在GenServer中启动监控器会导致进程重启行为出现问题?_Erlang_Elixir_Otp - Fatal编程技术网

Erlang 为什么在GenServer中启动监控器会导致进程重启行为出现问题?

Erlang 为什么在GenServer中启动监控器会导致进程重启行为出现问题?,erlang,elixir,otp,Erlang,Elixir,Otp,正如问题的标题所述: 为什么在GenServer中启动监控器会导致进程重启行为出现问题 我发现一个讨论陈述了以下内容: 具体而言: “监管树提供的担保较少,因为流程可能会退出,并且监管人不会终止其子进程。” “如果命名了supervisors子级,这可能会导致问题,因为在树的较高位置(在其init/1中调用start_链接的进程上方)重新启动时,命名的子级可能仍然存在。” 当通过遍历监督树发现流程模块时,您会丢失一些高级OTP功能,如代码重新加载 根本原因是什么?这在总体上是正确的吗

正如问题的标题所述:

为什么在GenServer中启动监控器会导致进程重启行为出现问题

我发现一个讨论陈述了以下内容:

具体而言:

  • “监管树提供的担保较少,因为流程可能会退出,并且监管人不会终止其子进程。”

  • “如果命名了supervisors子级,这可能会导致问题,因为在树的较高位置(在其init/1中调用start_链接的进程上方)重新启动时,命名的子级可能仍然存在。”

  • 当通过遍历监督树发现流程模块时,您会丢失一些高级OTP功能,如代码重新加载

根本原因是什么?这在总体上是正确的吗

工具书类
  • 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特征。