1

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

我目前在主管模块中启动孩子,如下所示:

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 是否已经有一个孩子?

4

1 回答 1

2

建立一个开始的主管:

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

确保您的主要主管reducer_supreducer_server. 的状态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. 我建议阅读这个这个,以便更好地了解所有这些部分是如何协同工作的。如果您将此代码放入生产环境中,您可能需要考虑以下事项:

  • 当进程死亡时会发生什么?提示:使用 . 检查活性is_process_alive/1
  • 如果其中一个reducer_serverreducer_sup死亡会发生什么?
于 2011-05-29T21:32:49.210 回答