是gen_server了吗?

时间:2011-06-25 02:40:03

标签: erlang otp supervisor gen-server

有没有办法告诉gen_server:“主管已初始化所有gen_servers,现在你可以发送消息”?

我有一个worker gen_server,其工作是在他的监督树中设置其他gen_servers的状态。如果我刚开始在配置服务器的init函数中发送消息,有时它会获得{noproc,_}。我想这意味着配置服务器要快:他在主管有足够的时间启动所有工作人员之前发送了消息。我通过在config_server:init()中放置timer:sleep(500)来解决这个问题,这确保了所有gen_server都有足够的时间进行初始化,但这似乎是一个不优雅的解决方案。

有没有正确的方法呢?

3 个答案:

答案 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).

这是我处理此问题的案例。只有在请求时才会触发此工作进程。