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监督吗?
最简单的方法可能是在本地别名下注册child1和child2注册.您可以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库
| 归档时间: |
|
| 查看次数: |
385 次 |
| 最近记录: |