рабочий выходит из старта в Supervisor - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь запустить указанных ниже сотрудников в Supervisor, который я вызываю в модуле приложения в mix.exs

Примерно так:

defmodule AppStarter do
import Supervisor.Spec
def start(_type,_args) do
    children=[
        worker(TPMod1,[],[]),
        worker(TPMod2,[],[])
    ]
    opts=[strategy: :one_for_one, name: HelloVisor]
    Supervisor.start_link(children,opts)
end


end

Один из моих модулей - GenServer, а другой -Я держал простой процесс прослушивания.

defmodule TPMod1 do

def start_link() do
 IO.puts "started TPMod1"
 listen()
end



def listen() do
  receive do
    _ -> :ok
  end
  listen()
end

 def child_spec(opts) do
      %{
        id: __MODULE__,
        start: {__MODULE__, :start_link, []},
        type: :worker,
        restart: :permanent,
        shutdown: 500
      }
    end


end

Проблема в том, что он застревает и не запускает работника 2 TPMod2 Я пытался сделать это в TPMod1 * start_link()

def start_link() do
 IO.puts "started TPMod1"
 Task.async(&listen/0)
end

Но это дает мнеthis

** (Mix) Не удалось запустить приложение tproject: AppStarter.start (: normal, []) вернул ошибку: shutdown: не удалось запустить child: TPMod1 ** (EXIT)% Task{owner: #PID <0.143.0>, pid: #PID <0.144.0>, ref: #Reference <0.2187290957.3420192769.212288>}

Я могу сделать его GenServer и заставить его работать, нокак мы можем начать простой работник?И почему супервизор не перезапускает его снова?не бесконечно, а несколько раз?Это должно было по крайней мере попытаться перезапустить и потерпеть неудачу.Пожалуйста, предложите другие улучшения, если таковые имеются.

1 Ответ

1 голос
/ 11 мая 2019

Супервайзер ожидает, что дети вернутся {:ok, pid}, :ignore или {:error, reason}.

Он зависает, потому что когда супервизор запускает на вашем работнике функцию start_link, он выполняет (как он сам), listen, который устанавливает блок receive, поэтому он застревает там. Когда вы используете start_link модуля gen_ * и его друзей, он позаботится о создании, правильном возвращении и т. Д.

В вашем случае вы можете переключиться:

def start_link() do
 IO.puts "started TPMod1"
 listen()
end

до:

def start_link() do
 pid = spawn(__MODULE__, :listen, [])
 {:ok, pid}
end

И это должно сделать это.

...