Erlang gen_服务器是否已启动?
有没有办法告诉gen_服务器:“主管已初始化所有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
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).