4

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

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

有没有合适的方法来做到这一点?

4

3 回答 3

3

从 中返回具有超时0的元组init。然后在它返回后立即handle_info(timeout, State)被调用。在进行handle_info一些调用,直到主管完成初始化(例如)才会返回supervisor:which_children

于 2011-06-25T04:12:28.153 回答
0

在函数init()调用gen_server:cast(init, State)中。消息“init”将在消息队列中排在第一位

于 2011-06-25T08:10:41.760 回答
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).

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

于 2011-06-25T14:31:18.220 回答