2017-04-14 68 views
2

我試圖實現類似於this answer中描述的內容,但是當我編譯應用程序時,出現如下所示的錯誤。監督樹未能啓動

** (Mix) Could not start application workers: Workers.Application.start(:normal, []) returned an error: shutdown: failed to start child: {Workers.UrlSupervisor, 2} 
    ** (EXIT) already started: #PID<0.1034.0> 

我不確定我是否內在地做某件事情,我不允許在這裏,或者我犯了一個小錯誤。

對於這裏有些方面是主管:

defmodule Workers.Application do 
    # See http://elixir-lang.org/docs/stable/elixir/Application.html 
    # for more information on OTP Applications 
    @moduledoc false 

    use Application 

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

    url_workers = 1..100 |> Enum.map(fn (i) -> supervisor(Workers.UrlSupervisor, [i], [id: {Workers.UrlSupervisor, i}, restart: :temporary]) end) 
    domain_workers = 1..100 |> Enum.map(fn (i) -> supervisor(Workers.DomainSupervisor, [i], [id: {Workers.DomainSupervisor, i}, restart: :temporary]) end) 

    opts = [strategy: :one_for_one, name: Workers.Supervisor] 
    Supervisor.start_link(url_workers ++ domain_workers, opts) 
    end 
end 

defmodule Workers.UrlSupervisor do 
    def start_link(id) do 
    import Supervisor.Spec, warn: false 

    children = [worker(Task, [&Workers.Url.worker/0], [id: {Workers.Url, id}, restart: :permanent])] 

    opts = [strategy: :one_for_one, name: Workers.UrlSupervisor] 
    Supervisor.start_link(children, opts) 
    end 
end 

defmodule Workers.DomainSupervisor do 
    def start_link(id) do 
    import Supervisor.Spec, warn: false 

    children = [worker(Task, [&Workers.Domain.worker/0], [id: {Workers.Domain, id}, restart: :permanent])] 

    opts = [strategy: :one_for_one, name: Workers.DomainSupervisor] 
    Supervisor.start_link(children, opts) 
    end 
end 

這裏是一個工人(他們看起來大致相同)。

defmodule Workers.Domain do 
    def worker do 
    case Store.Domains.pop do 
     :empty -> 
     IO.puts "[Domain] none found, waiting..." 
     :timer.sleep(1000) 
     {crawl_id, domain} -> 
     IO.puts "[Domains] found a domain to check: #{domain}" 
     case Core.check_domain(domain) do 
      :error -> 
      Utils.insert(crawl_id, domain, false) 
      :registered -> 
      Utils.insert(crawl_id, domain, false) 
      :available -> 
      Utils.insert(crawl_id, domain, true) 
     end 
    end 
    worker() 
    end 
end 
+3

在你的'Workers.Application',開始的時候'Supervisor's,您提供獨特'id's,但他們也應該有獨特的名。你能否嘗試添加另一個關鍵字,比如'name::「url_supervisor _#{i}」',以及域管理員的類似事情? –

+0

完全解決了它,我的愚蠢錯誤!如果你把這個做成一個答案,我會接受它:) – Zen

+1

完成。樂意效勞! –

回答

2

在你Workers.Application啓動時Supervisor S,找你提供獨特id S中,但也應該有獨特的name秒。

嘗試增加另一個關鍵字,像名稱::"url_supervisor_#{i}"

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

    url_workers = 1..100 |> Enum.map(fn (i) -> 
    supervisor(Workers.UrlSupervisor, [i], 
       [id: {Workers.UrlSupervisor, i}, 
       name: :"url_supervisor_#{i}", # Name added here 
       restart: :temporary]) 
    end) 
    domain_workers = 1..100 |> Enum.map(fn (i) -> 
    supervisor(Workers.DomainSupervisor, [i], 
       [id: {Workers.DomainSupervisor, i}, 
       name: :"domain_supervisor_#{i}", # Name added here 
       restart: :temporary]) 
    end) 

    opts = [strategy: :one_for_one, name: Workers.Supervisor] 
    Supervisor.start_link(url_workers ++ domain_workers, opts) 
end