2016-01-14 13 views
6

Podczas korzystania z funkcji "Utwórz aplikację" zawsze dodaje się do projektu główny plik nadzorcy. Zwróć uwagę, że tablica "child spec" w funkcji nadzorowania jest pusta.Eliksir/Erlang and Cowboy - Korzystanie z funkcji nadzorowania

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 

Punkt wejścia do aplikacji jest również stworzony dla Ciebie. Pracując przez kilka przykładów znalazłem w Internecie, napisałem co następuje:

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 

Ta aplikacja działa, ale działa również jeśli usunąć wywołanie App.Supervisor.start_link() w App.start().

Do czego służy przełożony w tym przypadku? Jeśli specyfikacja dziecka dla przełożonego jest pusta, jaki jest tego sens?

Na przykład, w przykładzie Elixir znaleźć tutaj - https://github.com/IdahoEv/cowboy-elixir-example/blob/master/lib/cowboy_elixir_example.ex - Widać, że wezwanie do rozpoczęcia przełożonego jest wypowiedziało się na linii 65.

Ale w oficjalnym Cowboy Erlang przykład ten plik - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl - Tworzy podobnego administratora głównego bez dodatku potomnego, a następnie wywołuje go w głównym pliku aplikacji tutaj, w linii 22 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl

Odpowiedz

7

Istnieje koncepcja wyższego poziomu niż drzewo nadzoru: application.

Projekt zazwyczaj składa się z wielu aplikacji. Każdy z nich może mieć własne drzewo nadzoru. Jeśli masz Erlang i Elixir zainstalowany poprawnie z wxwidgets, widać to przez wykonanie:

:observer.start 

Otwiera to graficzny interfejs użytkownika. Przejdź do zakładki Applications i kliknij nazwy aplikacji po prawej stronie. Pokazuje tylko procesy zgodne z zasadami OTP. Jeśli Twój przykład jest podobny do tego z repozytorium kowbojów, powinieneś zobaczyć wszystkich akceptorów pod numerem ranch.

Przełożony z pustą listą pracowników nic nie robi. Jest tam, na wypadek, gdybyś musiał później dodać niektóre procesy. Nie powoduje żadnej szkody, aby go uruchomić, ale także nie jest konieczne. Może się tak zdarzyć, że programiści nie zadali sobie trudu usunięcia po uruchomieniu projektu z szablonu.

Istnieją dwa rodzaje wniosków:

  • aktywnymi aplikacjami - wykorzystujące procesy wykonywać swoją pracę (na przykład ranczo), powinny one rozpocząć i zatrzymać jako jednostka
  • aplikacje biblioteczne - które po prostu dostarczyć trochę kodu, który jest uruchamiany w kontekście innych procesów (na przykład dekoderów/koderów json).

Zazwyczaj aplikacje aktywne mają najwyższego nadzorcę, a aplikacje bibliotek nie.

Powiązane problemy