有没有办法告诉gen_server:“主管已初始化所有gen_servers,现在你可以发送消息”?
我有一个worker gen_server,其工作是在他的监督树中设置其他gen_servers的状态。如果我刚开始在配置服务器的init函数中发送消息,有时它会获得{noproc,_}。我想这意味着配置服务器要快:他在主管有足够的时间启动所有工作人员之前发送了消息。我通过在config_server:init()中放置timer:sleep(500)来解决这个问题,这确保了所有gen_server都有足够的时间进行初始化,但这似乎是一个不优雅的解决方案。
有没有正确的方法呢?
答案 0 :(得分:2)
从0
返回超时init
的元组。然后在它返回后立即调用handle_info(timeout, State)
。在handle_info
中进行一些调用,在主管完成初始化之前不会返回(例如supervisor:which_children
)。
答案 1 :(得分:0)
在函数init()
中调用gen_server:cast(init, State)
。消息“init”将首先出现在消息队列中
答案 2 :(得分:0)
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).
这是我处理此问题的案例。只有在请求时才会触发此工作进程。