我正在编写一个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是否已有孩子?
答案 0 :(得分:2)
建立一个开始的主管:
reducer_server
reducer_sup
确保您的主管在reducer_sup
之前启动reducer_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
了。我建议您阅读this和this,以便更好地了解所有这些部分如何协同工作。如果您将此代码放入生产环境中,您可能需要考虑以下内容:
is_process_alive/1
检查实时性。reducer_server
或reducer_sup
死亡会怎样?