Erlang gen_服务器是否已启动?

Erlang gen_服务器是否已启动?,erlang,otp,erlang-supervisor,gen-server,Erlang,Otp,Erlang Supervisor,Gen Server,有没有办法告诉gen_服务器:“主管已初始化所有gen_服务器,现在您可以发送消息了” info(PlayerId) -> Pid = case global:whereis_name(util:getRegName({?MODULE, PlayerId})) of P when is_pid(P) -> P; _ -> {ok, P} = player_sup:start_child(PlayerId), P e

有没有办法告诉gen_服务器:“主管已初始化所有gen_服务器,现在您可以发送消息了”

info(PlayerId) ->
Pid = case global:whereis_name(util:getRegName({?MODULE, PlayerId})) of
    P when is_pid(P) ->
        P;
    _ ->
        {ok, P} = player_sup:start_child(PlayerId),
        P
end,
gen_server:call(Pid, info).
我有一个工人gen_服务器,其工作是在他的监督树中设置其他gen_服务器的状态。如果我刚开始在配置服务器的init函数中发送消息,有时它会得到{noproc,}。我想这意味着配置服务器太快了:他在主管有足够时间启动所有工作人员之前发送了消息。我通过将timer:sleep(500)放在config_server:init()中修复了这个问题,这确保了所有gen_服务器都有足够的时间进行初始化,但这似乎是一个不雅观的解决方案

info(PlayerId) ->
Pid = case global:whereis_name(util:getRegName({?MODULE, PlayerId})) of
    P when is_pid(P) ->
        P;
    _ ->
        {ok, P} = player_sup:start_child(PlayerId),
        P
end,
gen_server:call(Pid, info).

有正确的方法吗?

init
返回超时为
0
的元组。然后在它返回后,将立即调用
handle\u info(超时,状态)
。在
handle\u info
中进行一些调用,这些调用在主管完成初始化之前不会返回(例如
supervisor:which\u children
)。

在函数
init()
中调用
gen\u server:cast(init,State)
。消息“init”将是消息队列中的第一个

info(PlayerId) ->
Pid = case global:whereis_name(util:getRegName({?MODULE, PlayerId})) of
    P when is_pid(P) ->
        P;
    _ ->
        {ok, P} = player_sup:start_child(PlayerId),
        P
end,
gen_server:call(Pid, info).

这是我处理这个问题的情况。此工作进程仅在请求时触发。

注意:无法在
init
中调用
supervisor:which\u children
,因为在supervisor知道子进程已正确初始化之前,子进程调用
proc\u lib:init\u ack
。超时解决方案解决了这一问题,但是
send\u cast
也可以工作。
info(PlayerId) ->
Pid = case global:whereis_name(util:getRegName({?MODULE, PlayerId})) of
    P when is_pid(P) ->
        P;
    _ ->
        {ok, P} = player_sup:start_child(PlayerId),
        P
end,
gen_server:call(Pid, info).