gen_server с именем timer_server заставил функции модуля таймера не возвращаться

Я создал супервайзер, который породил gen_server, которого я назвал timer_server. Одна из задач этого timer_server — управлять регистрацией и вызывать timer:send_interval для отправки сообщения pid через определенный интервал.

Однако в инициализации gen_server, когда я вызываю timer:send_interval, я получаю зависание. В документации сказано, что таймер: функции возвращаются немедленно, так что это очень беспокоило.

Когда я переименовал свой gen_server в record_timer_server, эта проблема исчезла. Тогда мой вопрос двоякий:

  1. Зачем мне создавать зарегистрированный процесс timer_server, если он уже был, когда timer:start() вызывался при запуске моего приложения?
  2. Почему после запуска эта функция не вызвала плохое совпадение при поиске имени, если она обращалась к моему timer_server с помощью функции send_interval?

Я не думаю, что код необходим, но я могу обновить, чтобы добавить его, если потребуется.


person Rob Elsner    schedule 01.02.2009    source источник


Ответы (1)


Это можно воссоздать, просто выполнив следующие действия, которые зависают при вызове timer:send_interval.

1> register(timer_server, self()).
true
2> timer:send_interval(5000, self(), hello).

Пока это не удается...

1> timer:send_interval(5000, self(), hello).
{ok,{interval,#Ref<0.0.0.32>}}
2> register(timer_server, self()).
** exited: {badarg,[{erlang,register,[timer_server,<0.30.0>]},

Итак, кажется, что первый вызов timer пытается запустить процесс с именем timer_server и зависает, если вы взяли это имя первым.

Что касается того, почему он зависает, timer.erl делает:

ensure_started() ->
    case whereis(timer_server) of
        undefined -> 
            C = {timer_server, {?MODULE, start_link, []}, permanent, 1000, 
                worker, [?MODULE]}
            supervisor:start_child(kernel_safe_sup, C),  % kernel_safe_sup
            ok;
        _ -> ok
    end.

который возвращает "отлично", за которым следует gen_server:вызов timer_server. Затем ваш процесс застревает в ожидании ответа.

person cthulahoops    schedule 01.02.2009