2016-01-14 37 views
6

Quando si utilizza Mix per creare un'applicazione, aggiunge sempre un file di supervisione root al progetto. Nota come la matrice 'child spec' nella funzione supervise è vuota.Elisir/Erlang e Cowboy - Come usare i supervisori

app.ex:

defmodule App.Supervisor do 
    use Supervisor 

    def start_link do 
     Supervisor.start_link(__MODULE__, :ok) 
    end 

    def init(args) do 
     supervise([], [strategy: :one_for_one]) 
    end 
end 

un punto di ingresso per l'applicazione è stato creato anche per voi. Lavorando attraverso alcuni degli esempi che ho trovato on-line, ho scritto il seguente:

defmodule App do 
    def start(_type, _args) do 
     dispatch = :cowboy_router.compile([ 
      { 
       :_, 
       [ 
        # Simple JSON test. 
        {"/test", app.Handle.test, []}, 
       ] 
      } 
     ]) 

     {:ok, _} = :cowboy.start_http(
      :http, 
      100, 
      [{:port, 8080}], 
      [{ :env, [{:dispatch, dispatch}]}] 
     ) 

     App.Supervisor.start_link() 
    end 
end 

opere Questa applicazione, ma funziona anche se mi tolgo la chiamata a App.Supervisor.start_link() in App.start().

Quindi qual è il supervisore in questo caso? Se le specifiche del bambino per il supervisore sono vuote, allora qual è il punto?

Ad esempio, nell'esempio Elixir trovato qui - https://github.com/IdahoEv/cowboy-elixir-example/blob/master/lib/cowboy_elixir_example.ex - Si può vedere che la chiamata per avviare il supervisore è commentata sulla linea 65.

Ma in un Cowboy Erlang ad esempio ufficiale, questo file - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl - Crea un supervisore root simile senza specifiche figlio, quindi chiama il file principale dell'applicazione qui, sulla riga 22 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl

risposta

7

Esiste un concetto di livello superiore rispetto all'albero di supervisione: application.

Un progetto di solito consiste in molte applicazioni. Ognuno di loro può avere il proprio albero di supervisione. Se si dispone di Erlang e Elixir installati correttamente con wxwidgets, si può vedere eseguendo:

:observer.start 

Questo apre un'interfaccia utente grafica. Vai alla scheda Applications e fai clic sui nomi delle applicazioni sulla destra. Mostra solo i processi seguendo i principi OTP. Se il tuo esempio è simile a quelli del repository cowboy, dovresti vedere tutti i tuoi accettori sotto ranch.

Il supervisore con l'elenco di lavoro vuoto non fa nulla. È lì, nel caso in cui è necessario aggiungere alcuni processi in seguito. Non fa male all'inizio, ma non è nemmeno necessario. Potrebbe essere il caso, che i programmatori non si siano preoccupati di cancellare dopo aver avviato il progetto dal modello.

Ci sono due tipi di applicazioni:

  • applicazioni attive - che utilizzano processi per fare il loro lavoro (ad esempio Ranch), dovrebbero avviare e arrestare come unità
  • applicazioni libreria - che si limita a fornire del codice, che viene eseguito in un contesto di altri processi (ad esempio, i decoder JSON/codificatori)

di solito le applicazioni attive hanno migliori applicazioni di supervisione di livello e la biblioteca non lo fanno.