gen_server denominato timer_server ha impedito il ritorno delle funzioni del modulo timer
Domanda
Ho creato un supervisore che ha generato un gen_server
Ho chiamato timer_server
. Uno dei compiti di questa timer_serve
r è gestire la registrazione e chiamare timer:send_interval
per inviare un messaggio a un pid in un determinato intervallo.
Tuttavia, nell'iniziale di record_timer_server
, dove chiamo timer:start()
stavo ottenendo un blocco. La documentazione riportava il timer: le funzioni ritornano immediatamente, quindi questo è stato molto preoccupante.
Quando ho rinominato il mio send_interval
in <=> questo problema è stato risolto. La mia domanda è duplice quindi:
- Perché potrei creare un processo registrato <=>, se ce n'era già uno quando <=> è stato chiamato dall'avvio dell'applicazione?
- Una volta avviata, perché questa funzione non dovrebbe causare una mancata corrispondenza nel trovare il nome, se stava chiamando il mio <=> usando la funzione <=>?
Non credo che il codice sia necessario, ma posso aggiornarlo per aggiungerne alcuni se richiesto.
Soluzione
Questo può essere ricreato semplicemente facendo quanto segue che si blocca sulla chiamata al timer: send_interval.
1> register(timer_server, self()).
true
2> timer:send_interval(5000, self(), hello).
Anche se questo fallisce ...
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>]},
Quindi, sembra che la prima chiamata a timer tenti di avviare un processo chiamato timer_server, e si blocca se hai preso prima questo nome.
Per quanto riguarda il motivo per cui si blocca 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.
che ritorna bene, seguito da un gen_server: chiama a timer_server. Il tuo processo si blocca quindi aspettando che risponda.