Elixir - 从另一个节点调用gen服务器

时间:2017-06-12 06:43:09

标签: elixir nodes gen-server

我的电脑上有两个节点(foo@my-pcbar@my-pcbar节点中有一个简单的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中运行来将barNode.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  

我假设我错过了什么。但可以弄清楚是什么。

2 个答案:

答案 0 :(得分:4)

假设您只想在两个节点之间运行GenServer的单个实例,则需要将GenServer明确注册为全局:

use ExActor.GenServer, export: {:global, :bar_server}

答案 1 :(得分:0)

您注册一个进程以使其成为单例:使其作为唯一实例可用。

如果你给它一个名字为“name: processname”,那么你就不能在那个节点上注册另一个同名的进程。

如果您需要多个进程,那么您可以使用主管来获取该进程的子进程,使用它并要求主管在完成后终止子进程。

这种设计模式将帮助您通过主管管理子进程,以防子进程崩溃。