【发布时间】:2019-09-29 03:59:13
【问题描述】:
我正在尝试在我在 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
问题是它卡住并且没有启动worker 2 TPMod2 我尝试在TPMod1 的start_link() 中做
def start_link() do
IO.puts "started TPMod1"
Task.async(&listen/0)
end
但这给了我这个
** (Mix) 无法启动应用程序 tproject: AppStarter.start(:normal, []) 返回错误:shutdown: failed to 开始孩子:TPMod1 ** (EXIT) %Task{owner: #PID, pid: #PID, ref: #Reference}
我可以让它成为 GenServer 并让它工作,但是我们如何启动一个简单的 worker?为什么主管不再重新启动它?不是无限次,而是有时?它至少应该尝试重新启动并失败。如果有的话,请提出其他改进建议。
【问题讨论】:
标签: elixir gen-server erlang-supervisor