【问题标题】:Elixir :invalid_child_spec for supervised process. Can't figure out whyElixir :invalid_child_spec 用于受监督的过程。不知道为什么
【发布时间】:2015-09-27 23:56:02
【问题描述】:

我第一次致力于实施主管,但我遇到了无法从文档中弄清楚的问题。具体来说,当我尝试使用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

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: elixir erlang-otp


    【解决方案1】:

    从 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 应该可以工作了。

    【讨论】:

      【解决方案2】:

      问题出在

      Supervisor.start_child(SlowRamp.Supervisor, [])
      

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

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

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

      【讨论】:

      • 啊,我误解了它是如何工作的。谢谢!非常感谢您的帮助!
      • 完美答案。我们在这里过分依赖 Erlang 主管......我们可以有更好的错误消息,并且有一天我们会(希望如此!)。
      猜你喜欢
      • 2023-03-02
      • 2017-10-29
      • 2015-06-12
      • 1970-01-01
      • 2015-06-17
      • 2015-10-02
      • 2020-12-02
      • 2019-04-17
      • 2013-11-09
      相关资源
      最近更新 更多