问题描述
||
我正在写一个地图/减少单词计数器来学习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
去世会怎样?