Elixir:用于监督过程的invalid_child_spec.无法弄清楚为什么

kki*_*che 5 elixir erlang-otp

我正在努力第一次实现一个主管,我遇到了一些我无法从文档中找到的问题.具体来说,当我尝试使用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
Run Code Online (Sandbox Code Playgroud)

我的子函数/文件在./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
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感谢.谢谢!

ror*_*rra 3

问题出在

Supervisor.start_child(SlowRamp.Supervisor, [])
Run Code Online (Sandbox Code Playgroud)

您需要一个有效的子规范,例如:

def flood do
  import Supervisor.Spec
  Supervisor.start_child(SlowRamp.Supervisor, worker(SlowRamp.Flood, [], [id: :foo]))
end
Run Code Online (Sandbox Code Playgroud)

这就是它告诉子规范无效的原因

  • 完美的答案。我们在这里过于依赖 Erlang 监督者......我们可以有更好的错误消息,有一天我们会(希望如此!)。 (5认同)