在Elixir中获得兄弟姐妹的过程

Bri*_*cks 5 erlang elixir erlang-otp

我有一个Elixir/Erlang进程树:

parent (Supervisor)
??? child1 (GenServer)
??? child2 (GenServer)
Run Code Online (Sandbox Code Playgroud)

child1(数据库客户端)具有child2需要使用的信息.将引导从Supervisor进程传递给child2的好方法是什么,以便child2始终具有对child1的有效引用?我只需要重构我的应用程序,以便child1由child1监督吗?

Paw*_*rok 7

最简单的方法可能是在本地别名下注册child1child2注册.您可以GenServer通过传递name选项来启动您:

defmodule Child1 do
  use GenServer

  def start_link do
    GenServer.start_link(__MODULE__, [], name: __MODULE__)
  end
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由Child1模块支持的进程将在别名下本地注册Child1.然后,如果你想发送消息,你可以使用该别名而不是a PID.

defmodule Child1 do
  # ...

  def get_data do
    GenServer.call(__MODULE__, :get_data)
  end

  def handle_call(:get_data, _from, state) do
    {:reply, extract_data_from_state(state), state}
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您想要一个更复杂的解决方案,例如可以注册许多相同类型的不同进程,请查看gproc库