2017-08-30 22 views
0

我有一個application.ex,看起來像這樣:鳳凰:主管忽略的名字,新工藝

defmodule Qtrain.Application do 
    use Application 

    def start(_type, _args) do 
    import Supervisor.Spec 

    children = [ 
     supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor), 
     supervisor(Qtrain.Requests, [], name: Qtrain.Requests) 
    ] 

    Supervisor.start_link(children, strategy: :one_for_one) 
    end 

    def config_change(changed, _new, removed) do 
    QtrainWeb.Endpoint.config_change(changed, removed) 
    :ok 
    end 
end 

而一個requests.ex,看起來像這樣:

defmodule Qtrain.Requests do 
    use GenServer 
    alias Qtrain.Requests.Document 

    def start_link do 
    GenServer.start_link(__MODULE__, %{}) 
    end 

    def init(state) do 
    schedule_work() 
    {:ok, state} 
    end 

    def handle_info(:work, state) do 
    Document.start_link %{id: :one} 
    schedule_work() 
    {:noreply, state} 
    end 

    defp schedule_work() do 
    Process.send_after(self(), :work, 1 * 1000) 
    end 
end 

當我開始我的應用程序和運行:observer.start按預期方式,我可以看到帶有:one鍵的任務,但有兩件事是錯誤的。一,監管方沒有名字,儘管我在指定添加iex -S mix像這樣一個,兩個,後續處理:

Qtrain.Requests.Document.start_link %{id: :dammit} 

不會導致所添加的pid下過程。

:observer.start

但是,他們在進程選項卡顯示:

proc

有什麼理由我不能名監督員?爲什麼新的流程不會出現在它之下?

回答

3
  1. 薪火name選項Supervisor.Spec.supervisor/3在這兩種情況下沒有影響(檢查observer顯示Endpoint爲端點,而name設置爲Supervisor。)事實上,甚至有no option name understood。您應在後續GenServer.start_link(__MODULE__, %{}, name: __MODULE__)呼叫中設置該名稱,以使其顯示在observer中。

  2. Whatever.start_link不會使啓動的進程成爲監督樹的一部分。你應該明確地將其設置在相應監督的一個孩子Supervisor.start_child/2(當父是上司,不是你的情況下)或者只是調用從各自GenServer過程中Document.start_linksince

start_link啓動GenServer流程,鏈接到當前流程

例子:

defmodule Qtrain.Requests do 

    # interface 
    def document!(id) do 
    GenServer.call(__MODULE__, {:document, id}) 
    end 

    def handle_call({:document, id}, _from, state) do 
    Qtrain.Requests.Document.start_link %{id: id} 
    end 

    ... 
end 

現在:

Qtrain.Requests.document! :damnit 

會讓一個Document監督樹的一部分,因爲它會被鏈接到Requests過程。當您剛從控制檯啓動時,它與mix進程相關聯。

+0

那麼我不能要求更徹底的答案。謝謝!我正在從Rails移動一個sidekiq應用程序,並嘗試在OTP運氣。 –

+1

祝你好運!我個人發現它很直接,坦白地說,令人興奮的是,由於許多事情(特別是OTP),它們從紅寶石轉換爲靈藥。 – mudasobwa