gen_server llamado timer_server hizo que las funciones del módulo de temporizador no regresaran

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

  •  20-08-2019
  •  | 
  •  

Pregunta

Creé un supervisor que generó un gen_server al que llamé timer_server. Una de las tareas de este timer_serve r es gestionar el registro y llamar al timer:send_interval para enviar un mensaje a un pid en un intervalo determinado.

Sin embargo, en el inicio de record_timer_server, donde llamo a timer:start() estaba recibiendo un bloqueo. La documentación decía el temporizador: las funciones regresan de inmediato, por lo que esto fue muy problemático.

Cuando cambié el nombre de mi send_interval a <=> este problema se solucionó. Mi pregunta es doble:

  1. ¿Por qué podría crear un proceso registrado <=>, si ya había uno cuando se inició la aplicación <=>?
  2. Una vez iniciada, ¿por qué esta función no causaría una mala coincidencia para encontrar el nombre, si estaba llamando a mi <=> usando la función <=>?

No creo que el código sea necesario, pero puedo actualizar para agregar algunos si así lo solicita.

¿Fue útil?

Solución

Esto se puede recrear simplemente haciendo lo siguiente que se cuelga en la llamada al temporizador: send_interval.

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

Mientras esto falla ...

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>]},

Entonces, parece que la primera llamada al temporizador intenta iniciar un proceso llamado timer_server, y se cuelga si ha tomado este nombre primero.

En cuanto a por qué se cuelga timer.erl hace:

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 devuelve bien, seguido de un gen_server: llamada a timer_server. Su proceso se atasca esperando que responda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top