检查OTP simple_one_for_one主管中的现有子项

时间:2011-05-29 10:20:38

标签: erlang mapreduce otp

我正在编写一个map / reduce字计数器来学习OTP。我已经创建了一个可以启动reducer的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是否已有孩子?

1 个答案:

答案 0 :(得分:2)

建立一个开始的主管:

  • gen_server。我们称之为reducer_server
  • simple_one_for_one主管。我们称之为reducer_sup

确保您的主管在reducer_sup之前启动reducer_serverreducer_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了。我建议您阅读thisthis,以便更好地了解所有这些部分如何协同工作。如果您将此代码放入生产环境中,您可能需要考虑以下内容:

  • 当流程死亡时会发生什么?提示:使用is_process_alive/1检查实时性。
  • 如果reducer_serverreducer_sup死亡会怎样?