我的电脑上有两个节点(foo@my-pc
和bar@my-pc
)
bar
节点中有一个简单的gen-server:
defmodule Bar.Server do
use ExActor.GenServer, export: :bar_server
defstart start_link, do: initial_state(0)
defcall get, state: state, do: reply(state)
defcast(set(num), state: state, do: new_state(state + num))
end
Genserver已启动并正在运行 所以当我跑:
GenServer.call(:bar_server, :get)
它完美无缺。
我通过在foo foo
中运行来将bar
与Node.connect :'bar@my-pc'
联系起来
我期望的是现在foo
将熟悉:aa
中的genserver bar
,
但是 - 当我跑步时
GenServer.call(:bar_server, :get)
我得到:
(EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
我假设我错过了什么。但可以弄清楚是什么。
答案 0 :(得分:4)
假设您只想在两个节点之间运行GenServer的单个实例,则需要将GenServer明确注册为全局:
use ExActor.GenServer, export: {:global, :bar_server}
答案 1 :(得分:0)
您注册一个进程以使其成为单例:使其作为唯一实例可用。
如果你给它一个名字为“name: processname”,那么你就不能在那个节点上注册另一个同名的进程。
如果您需要多个进程,那么您可以使用主管来获取该进程的子进程,使用它并要求主管在完成后终止子进程。
这种设计模式将帮助您通过主管管理子进程,以防子进程崩溃。