在主管中启动后,工作人员退出

时间:2019-05-11 14:25:30

标签: elixir supervisor gen-server

我试图在我在mix.exs的应用程序模块中调用的Supervisor中启动以下工作程序

喜欢

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的{​​{1}}中尝试过

start_link()

但是给我这个

  

**(混合)无法启动应用程序tproject:AppStarter.start(:n​​ormal,[])返回错误:关闭:未能   起始子项:TPMod1       **(退出)%Task {所有者:#PID <0.143.0>,pid:#PID <0.144.0>,ref:#Reference <0.2187290957.3420192769.212288>}

我可以使它成为GenServer并使它工作,但是我们如何才能启动一个简单的工作程序呢?为什么主管不重新启动它?不是无限地但有时?它至少应该尝试重新启动并失败。请提出其他改进建议。

1 个答案:

答案 0 :(得分:1)

上司希望孩子们返回{:ok, pid}:ignore{:error, reason}

它挂起是因为主管在您的工作程序上运行start_link函数时,它(以他本人的身份)执行listen并设置了一个receive块,因此卡在了那里。当您使用gen_ *模块的start_link和朋友时,它会负责生成,正确返回等。

根据您的情况,您可以切换:

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

收件人:

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

这应该做到。