работает gen_server? - PullRequest
       66

работает gen_server?

3 голосов
/ 25 июня 2011

Есть ли способ сообщить gen_server: «супервизор инициализировал все gen_servers, теперь вы можете отправлять затем сообщения»?

У меня есть рабочий gen_server, задачей которого является настройка состояний других gen_servers в егоДерево наблюдения.Если я просто начинаю отправлять сообщения в функции init моего сервера конфигурации, иногда он получает {noproc, _}.Я предполагаю, что это означает, что сервер конфигурации был быстрым: он отправлял сообщения, прежде чем у супервайзера было достаточно времени, чтобы запустить всех рабочих.Я исправил это, поместив timer: sleep (500) в config_server: init (), который гарантирует, что у всех gen_server было достаточно времени для инициализации, но это кажется неэффективным решением.

Есть ли правильный способ сделать это

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Возврат кортежа с таймаутом 0 из init.Затем, сразу после возврата, будет вызван handle_info(timeout, State)handle_info выполните вызов, который не будет возвращен, пока супервизор не завершит инициализацию (например, supervisor:which_children).

0 голосов
/ 25 июня 2011
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).

Это мой случай, чтобы решить эту проблему. Этот рабочий процесс запускается только при запросе.

0 голосов
/ 25 июня 2011

в функции init() вызов gen_server:cast(init, State). сообщение «init» будет первым в очереди сообщений

...