【问题标题】:Dynamic supervisor starts itself as a child supervisor动态主管以子主管开始
【发布时间】:2013-06-19 23:11:32
【问题描述】:

我需要一个能培养两种孩子的导师。

第一个是主管孩子,和主管一样, 我可以用与主管相同的模块开始一个孩子吗?

例如:

-module(test_sup).
-behaviour(supervisor).

-export([start_link/0]).
-export([init/1]).

start_link() ->
     supervisor:start_link({local,?MODULE}, ?MODULE, []).

init(_Args) ->
        RestartStrategy = {one_for_one, 10, 60},
        {ok, {RestartStrategy, 

        [{sup,
        {sup, start_link, []},
        permanent, infinity, supervisor, [sup]},

  ]}}.

在主管模块中我用相同的模块初始化一个孩子,这可能吗?

第二种孩子是普通工人,有自己的模块,这不是问题。 但是我可以在主管模块中动态启动这两种不同的类型吗?

【问题讨论】:

  • 如果一个监督者自己产生,那么你会得到一个无限的监督者树,对吧?内存不足时可能会使应用程序崩溃。似乎比较没用。你想完成什么?
  • 我想建立一个目录的索引,例如我在一个目录中启动主管,并且对于每个子文件夹我想启动一个新的主管进程。并且每个文件夹的主管启动一个子进程来索引文件夹的文件。这是课程中的练习

标签: process erlang erlang-supervisor


【解决方案1】:

Ward 的建议确实不错。你可以看看这个页面:LearYousomeErlang : the count of application,它有一个你应该使用的模式的完整示例

【讨论】:

    【解决方案2】:

    在您的评论中,您说您希望为遇到的每个子文件夹启动一个进程。 OTP 为此创建了simple_one_for_one 主管。

    在工作进程的 start_link 中,您可以提供您希望进程索引的目录路径作为参数。

    您可以查看我的 full text search engine 教程,了解 simple_one_for_one 主管的工作示例。

    【讨论】:

    • 但是我有一个主管控制所有文件夹的工作人员,或者?但我需要一个像目录树一样的主管树。例如,我在文件夹“home”中启动主管,其中包含两个子文件夹“mary”和“joe”,所以我需要两个子主管来管理这个子文件夹。并且每个主管都必须为文件启动一个工作人员。
    • 例如,子文件夹“mary”的supervisor-child必须为“mary”中的子文件夹启动其他supervisor-child。等等……
    • @user2513102 我知道这是您必须完成的任务,但我认为创建这样的主管树并不能教会人们正确理解 OTP 原则。这应该是最终目标吧?
    猜你喜欢
    • 2016-06-11
    • 2016-01-01
    • 2018-03-27
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多