Elixir :invalid_child_spec 用于监督过程。不知道为什么
Elixir :invalid_child_spec for supervised process. Can't figure out why
我是第一次尝试实现 supervisor,我 运行 遇到了我无法从文档中弄清楚的问题。具体来说,当我尝试使用 SlowRamp.flood
开始我的过程时,我得到 {:error, {:invalid_child_spec, []}}
.
这是一个非常简单的应用程序,是使用 mix new slow_ramp --sup.
制作的
./lib/slow_ramp.ex
中的主文件是:
defmodule SlowRamp do
use Application
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(SlowRamp.Flood, [])
]
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: SlowRamp.Supervisor]
Supervisor.start_link(children, opts)
end
def flood do
Supervisor.start_child(SlowRamp.Supervisor, [])
end
end
我的子函数/文件在 ./lib/SlowRamp/flood.ex
中,看起来像这样:
defmodule SlowRamp.Flood do
def start_link do
Task.start_link(fn -> start end)
end
defp start do
receive do
{:start, host, caller} ->
send caller, System.cmd("cmd", ["opt"])
end
end
end
非常感谢任何帮助。谢谢!
问题在
Supervisor.start_child(SlowRamp.Supervisor, [])
您需要一个有效的子规范,例如:
def flood do
import Supervisor.Spec
Supervisor.start_child(SlowRamp.Supervisor, worker(SlowRamp.Flood, [], [id: :foo]))
end
这就是它告诉子规范无效的原因
从 elixir 1.5 开始,您现在也可以定义一个 child_spec
来解决这个问题。
在SlowRamp.Flood
里面,添加一个这样的函数:
defmodule SlowRamp.Flood do
def child_spec(arg) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [arg]},
type: :worker
}
end
# Rest of your code here
end
之后,您现有的 start_link
应该可以使用。
我是第一次尝试实现 supervisor,我 运行 遇到了我无法从文档中弄清楚的问题。具体来说,当我尝试使用 SlowRamp.flood
开始我的过程时,我得到 {:error, {:invalid_child_spec, []}}
.
这是一个非常简单的应用程序,是使用 mix new slow_ramp --sup.
制作的./lib/slow_ramp.ex
中的主文件是:
defmodule SlowRamp do
use Application
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(SlowRamp.Flood, [])
]
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: SlowRamp.Supervisor]
Supervisor.start_link(children, opts)
end
def flood do
Supervisor.start_child(SlowRamp.Supervisor, [])
end
end
我的子函数/文件在 ./lib/SlowRamp/flood.ex
中,看起来像这样:
defmodule SlowRamp.Flood do
def start_link do
Task.start_link(fn -> start end)
end
defp start do
receive do
{:start, host, caller} ->
send caller, System.cmd("cmd", ["opt"])
end
end
end
非常感谢任何帮助。谢谢!
问题在
Supervisor.start_child(SlowRamp.Supervisor, [])
您需要一个有效的子规范,例如:
def flood do
import Supervisor.Spec
Supervisor.start_child(SlowRamp.Supervisor, worker(SlowRamp.Flood, [], [id: :foo]))
end
这就是它告诉子规范无效的原因
从 elixir 1.5 开始,您现在也可以定义一个 child_spec
来解决这个问题。
在SlowRamp.Flood
里面,添加一个这样的函数:
defmodule SlowRamp.Flood do
def child_spec(arg) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [arg]},
type: :worker
}
end
# Rest of your code here
end
之后,您现有的 start_link
应该可以使用。