【问题标题】:Checking for existing child in OTP simple_on_for_one supervisor在 OTP simple_on_for_one 主管中检查现有孩子
【发布时间】:2011-09-04 06:14:53
【问题描述】:

我正在编写一个 map/reduce 单词计数器来学习 OTP。我创建了一个可以启动减速器的 simple_one_for_one 主管。对于每个 Key,我想检查是否已经有一个孩子,如果没有,让主管创建孩子。

我目前在主管模块中像这样启动孩子:

start_child(Key) ->
    supervisor:start_child(?SERVER, [Key]).

我想做这样的事情(未经测试):

start_child(Key) ->
    case supervisor:child_pid(Key) of
    Pid -> Pid;
    _ -> supervisor:start_child(?SERVER, [Key])
    end.

有什么好的 OTP 方法可以确定 Key 是否已经有一个孩子?

【问题讨论】:

    标签: erlang mapreduce erlang-otp


    【解决方案1】:

    建立一个启动的主管:

    • 一个gen_server。我们就叫它reducer_server
    • simple_one_for_one 主管。我们就叫它reducer_sup

    确保您的主要主管在 reducer_server 之前启动 reducer_sup。 reducer_server 的状态可能是 Key -> Pid 对的字典。然后reducer_server 将具有类似reduce(Key) 的函数,它要么在字典中找到键并知道相应的进程,要么找不到键并运行如下函数:

    new_reduce(Key) ->
        case supervisor:start_child(reducer_sup, [Key]) of
            {ok, Pid} when is_pid(Pid) -> {ok, Pid};
            {ok, Pid, _} when is_pid(Pid) -> {ok, Pid};
            _ -> error
        end.
    

    只需将生成的 pid 添加到您的状态,您就应该准备好下一次调用 reduce/1。我建议阅读this 和this,以更好地了解所有这些部分如何协同工作。如果您将此代码放入生产环境中,您可能需要考虑以下事项:

    • 当进程死亡时会发生什么?提示:使用is_process_alive/1 检查活跃度。
    • 如果reducer_server 或reducer_sup 死了会怎样?

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 2016-01-16
      • 2015-01-22
      • 1970-01-01
      • 2017-03-19
      • 2014-06-17
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多