我试图在我在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(:normal,[])返回错误:关闭:未能 起始子项:TPMod1 **(退出)%Task {所有者:#PID <0.143.0>,pid:#PID <0.144.0>,ref:#Reference <0.2187290957.3420192769.212288>}
我可以使它成为GenServer并使它工作,但是我们如何才能启动一个简单的工作程序呢?为什么主管不重新启动它?不是无限地但有时?它至少应该尝试重新启动并失败。请提出其他改进建议。
答案 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
这应该做到。