gen_server chamado timer_server causada funções do módulo temporizador para não retorno

StackOverflow https://stackoverflow.com/questions/500169

  •  20-08-2019
  •  | 
  •  

Pergunta

Eu criei um supervisor que gerou uma gen_server Liguei timer_server. Uma das tarefas desta timer_server é 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:

  1. Por que eu poderia criar um timer_server processo registrada, se já havia um quando timer:start() foi chamado pelo meu aplicativo arranque?
  2. 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ção send_interval?

Eu não acho que o código é necessária, mas posso atualizar para adicionar algum se solicitado.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top