【问题标题】:Erlang: cascaded supervisors?Erlang:级联监督者?
【发布时间】:2009-12-03 19:54:42
【问题描述】:

是否可以在应用程序中级联监督者?

例如主管sup1 产生一个创建主管sup2 的子进程?

【问题讨论】:

    标签: erlang erlang-supervisor


    【解决方案1】:

    您可能希望将孩子添加为主管。

    它是主管的孩子的 childspec 中的条目。孩子的“类型”可以设置为“主管”:

    http://www.erlang.org/doc/design_principles/sup_princ.html#spec

    也许你也可以通过孩子自己启动主管来做到这一点,但它至少不那么优雅,而且你在做什么也不那么明显。

    HTH, h.

    【讨论】:

      【解决方案2】:

      是的,您可以简单地将主管添加为主管的子级。或者混搭。我通常会这样做:

      (在我的顶级主管中)

      init([]) ->
          Args = [],
          ModuleArray = [get_info(Module, Args)
                 || Module
                    <- [emx_nodestate, emx_sup_data, emx_sup_util, emx_sup_api,
                        emx_flow]],
          {ok, {{one_for_one, 3, 1}, ModuleArray}}.
      
      get_info(Module, Args) ->
          {Module, {Module, start_link, [Args]}, permanent, 10000,
           worker, [Module]}.
      

      然后像 emx_sup_data(行为主管)这样的内容包含:

      init([]) ->
          Args = [],
          ModuleArray = [get_info(Module, Args)
                 || Module <- [job_housekeep]],
          {ok, {{one_for_all, 3, 1}, ModuleArray}}.
      
      get_info(Module, Args) ->
          {Module, {Module, start_link, [Args]}, permanent, 10000,
           worker, [Module]}.
      

      类似 emx_nodestate (behaviour gen_server)

      init([]) ->
          {ok, #state{status=starting, interested=[]}}.
      

      像梦一样工作......!

      【讨论】:

      • 这正是我所说的不是你可能想要做的相当的意思。以“emx_sup_data”顶级主管子级为例。在其 childspec(由 toplevelsupervisor:get_info/2 返回)中,它被定义为“worker”类型的孩子,而实际上,正如您自己声称的那样,它是“主管行为”说服的孩子。在这种情况下,最好在顶级主管的子规范中通过设置 Type=supervisor 而不是 worker 来标记它。
      • 是的,你应该将它标记为主管当然是对的,即使它只是对文档有用。但是该设置根本不会改变顶级主管的行为 - 上面的片段来自一个完全按预期工作的真实应用程序。在当前的 OTP 版本中,任何一个实际上都是有效的,它简化了我上面的代码,将它们硬编码给工人......!
      【解决方案3】:

      要了解其他人如何构建他们的应用程序,为什么不启动 shell 并运行工具栏:

      toolbar:start()
      

      这为您提供了主管层级的图形视图。快速浏览一下内核主管树,或者 mnesia 或 yaws,将向您展示“正常”主管树的样子。

      您编写由应用程序主管监督的子系统应用程序。每个子系统可以是子系统主管下的多个子系统(继续以递归函数方式应用模式,直到用完粒度...)

      【讨论】:

        猜你喜欢
        • 2016-02-12
        • 2011-08-07
        • 2012-01-13
        • 1970-01-01
        • 2014-09-12
        • 2023-03-02
        • 2015-05-16
        • 2010-10-15
        • 2011-05-24
        相关资源
        最近更新 更多