在OTP simple_on_for_one主管中检查现有子级

问题描述

|| 我正在写一个地图/减少单词计数器来学习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.
找出是否已经有Key的孩子的一种好的OTP方法是什么?     

解决方法

        建立一个开始的主管: 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
做好准备。我建议阅读此书,以便更好地了解所有这些部分如何协同工作。如果要将这段代码放入生产环境中,则可能需要考虑以下内容: 流程死亡时会发生什么?提示:用
is_process_alive/1
检查是否活泼。 如果
reducer_server
reducer_sup
去世会怎样?