gen_server chamado timer_server causada funções do módulo temporizador para não retorno
Pergunta
Eu criei um supervisor que gerou uma gen_server
Liguei timer_server
. Uma das tarefas desta timer_serve
r é o de gerir o registo e chamada timer:send_interval
para enviar uma mensagem a um pid em um determinado intervalo.
No entanto, na inicialização do gen_server
, onde eu chamo timer:send_interval
eu estava ficando um bloqueio. A documentação disse o temporizador:. Funções retornam imediatamente, por isso foi muito perturbador
Quando eu renomeado meu gen_server
para record_timer_server
este problema esclarecido. A minha pergunta é duas vezes, em seguida:
- Por que eu poderia criar um
timer_server
processo registrada, se já havia um quandotimer:start()
foi chamado pelo meu aplicativo arranque? - Uma vez iniciado, por que esta função não causa um badmatch encontrar o nome, se ele foi ligando para o meu
timer_server
usando a funçãosend_interval
?
Eu não acho que o código é necessária, mas posso atualizar para adicionar algum se solicitado.
Solução
Isto pode ser recriado simplesmente fazendo o seguinte, que trava na chamada para temporizador:. Send_interval
1> register(timer_server, self()).
true
2> timer:send_interval(5000, self(), hello).
Enquanto isso falhar ...
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>]},
Assim, parece que a primeira chamada para tentativas temporizador para iniciar um processo chamado timer_server, e trava se você tomou este nome em primeiro lugar.
Quanto ao porquê de ele trava timer.erl faz:
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.
que retorna bem, seguido por um gen_server: chamada para timer_server. Seu processo começa então espera preso por si mesmo para responder.