Elixir 菲尼克斯:主管忽略名称,新流程

Elixir 菲尼克斯:主管忽略名称,新流程,elixir,phoenix-framework,Elixir,Phoenix Framework,我有一个应用程序.ex如下所示: defmodule Qtrain.Application do use Application def start(_type, _args) do import Supervisor.Spec children = [ supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor), supervisor(Qtrain.Requests, [], nam

我有一个
应用程序.ex
如下所示:

defmodule Qtrain.Application do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor),
      supervisor(Qtrain.Requests, [], name: Qtrain.Requests)
    ]

    Supervisor.start_link(children, strategy: :one_for_one)
  end

  def config_change(changed, _new, removed) do
    QtrainWeb.Endpoint.config_change(changed, removed)
    :ok
  end
end
defmodule Qtrain.Requests do
  use GenServer
  alias Qtrain.Requests.Document

  def start_link do
    GenServer.start_link(__MODULE__, %{})
  end

  def init(state) do
    schedule_work()
    {:ok, state}
  end

  def handle_info(:work, state) do
    Document.start_link %{id: :one}
    schedule_work()
    {:noreply, state}
  end

  defp schedule_work() do
    Process.send_after(self(), :work, 1 * 1000)
  end
end
还有一个
requests.ex
,看起来像这样:

defmodule Qtrain.Application do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec

    children = [
      supervisor(QtrainWeb.Endpoint, [], name: Qtrain.Supervisor),
      supervisor(Qtrain.Requests, [], name: Qtrain.Requests)
    ]

    Supervisor.start_link(children, strategy: :one_for_one)
  end

  def config_change(changed, _new, removed) do
    QtrainWeb.Endpoint.config_change(changed, removed)
    :ok
  end
end
defmodule Qtrain.Requests do
  use GenServer
  alias Qtrain.Requests.Document

  def start_link do
    GenServer.start_link(__MODULE__, %{})
  end

  def init(state) do
    schedule_work()
    {:ok, state}
  end

  def handle_info(:work, state) do
    Document.start_link %{id: :one}
    schedule_work()
    {:noreply, state}
  end

  defp schedule_work() do
    Process.send_after(self(), :work, 1 * 1000)
  end
end
当我启动我的应用程序并运行
:observer.start
时,我可以按预期使用
:一个
键查看任务,但有两件事出错。第一,尽管我在
iex-S mix
中指定了一个和两个后续过程,但家长主管没有名字,就像这样:

Qtrain.Requests.Document.start_link %{id: :dammit}
不要导致在
pid
下添加进程

但是,它们确实会显示在“流程”选项卡中:

有什么原因我不能说出那个主管的名字吗?为什么新流程不会出现在它下面

  • name
    选项传递给
    Supervisor.Spec.Supervisor/3
    在这两种情况下都没有效果(检查
    observer
    是否为端点显示
    端点
    ,而
    name
    设置为
    Supervisor
    ),事实上甚至没有效果。您应该在调用后续的
    GenServer.start\u链接(\uuuuu MODULE\uuuuuu,%%{},名称:\uuuu MODULE\uuuuu)
    中设置名称,以使其显示在
    observer

  • Whatever.start\u链接
    不会使已启动的流程成为监督树的一部分。您应该明确地将其设置为相应主管的子级(如果父级是主管,而不是您的案例),或者只需调用
    Document。从相应
    GenServer
    流程中启动链接

  • start\u link
    启动链接到当前进程的
    GenServer
    进程

    例如:

    defmodule Qtrain.Requests do
    
      # interface
      def document!(id) do
        GenServer.call(__MODULE__, {:document, id})
      end
    
      def handle_call({:document, id}, _from, state) do
        Qtrain.Requests.Document.start_link %{id: id}
      end
    
      ...
    end
    
    现在:

    Qtrain.Requests.document! :damnit
    
    文档
    作为监督树的一部分,因为它将链接到
    请求
    流程。当您刚从控制台启动它时,它被链接到
    mix
    进程

  • name
    选项传递给
    Supervisor.Spec.Supervisor/3
    在这两种情况下都没有效果(检查
    observer
    是否为端点显示
    端点
    ,而
    name
    设置为
    Supervisor
    ),事实上甚至没有效果。您应该在调用后续的
    GenServer.start\u链接(\uuuuu MODULE\uuuuuu,%%{},名称:\uuuu MODULE\uuuuu)
    中设置名称,以使其显示在
    observer

  • Whatever.start\u链接
    不会使已启动的流程成为监督树的一部分。您应该明确地将其设置为相应主管的子级(如果父级是主管,而不是您的案例),或者只需调用
    Document。从相应
    GenServer
    流程中启动链接

  • start\u link
    启动链接到当前进程的
    GenServer
    进程

    例如:

    defmodule Qtrain.Requests do
    
      # interface
      def document!(id) do
        GenServer.call(__MODULE__, {:document, id})
      end
    
      def handle_call({:document, id}, _from, state) do
        Qtrain.Requests.Document.start_link %{id: id}
      end
    
      ...
    end
    
    现在:

    Qtrain.Requests.document! :damnit
    

    文档
    作为监督树的一部分,因为它将链接到
    请求
    流程。当您刚从控制台启动它时,它被链接到
    mix
    过程。

    我不可能要求更全面的答案。非常感谢。我正在从Rails移动sidekiq应用程序,并在OTP尝试我的运气。祝你好运!我个人觉得从ruby到elixir是非常直接的,坦率地说,令人兴奋的,因为有很多事情(特别是OTP)。我不可能要求更彻底的答案。非常感谢。我正在从Rails移动sidekiq应用程序,并在OTP尝试我的运气。祝你好运!我个人觉得从ruby到elixir的转变非常直接,坦率地说,令人兴奋,因为有很多事情(特别是OTP)