gen_server denominato timer_server ha impedito il ritorno delle funzioni del modulo timer

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

  •  20-08-2019
  •  | 
  •  

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:

  1. Perché potrei creare un processo registrato <=>, se ce n'era già uno quando <=> è stato chiamato dall'avvio dell'applicazione?
  2. 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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top