单个模块中有多个Agent

时间:2016-12-18 04:10:09

标签: elixir

在模块中有多个代理是否可以?例如,我正在创建一个游戏,我需要一个游戏状态的包装器以及用户状态的包装器。一个例子:

defmodule TicTacToe do

  def start_game do
    Agent.start_link(..., name: Moves)
    Agent.start_link(..., name: Users)
  end

end

文档中的示例显示单个Agent.start_link,这使我认为不应该只有一个代理。

1 个答案:

答案 0 :(得分:3)

虽然拥有尽可能多的Agent s(它们仍然是erlang的gen_server是绝对合法的,但在这种特殊情况下,没有必要使用两个代理。< / p>

经验法则是“不要产生多余的服务器。”

一张带有:moves:users键的地图就足够了:

@doc """
Starts a new single agent for both moves and users.
"""
def start_link do
  Agent.start_link(fn -> %{moves: %{}, users: %{}} end)
end

@doc """
Gets a move by `key`.
"""
def get_move(key) do
  Agent.get(&get_in(&1, [:moves, key]))
end

在这里,我们使用深层地图挖掘Kernel.get_in/2。这是可取的方式,因为只要你编写健壮的应用程序,就应该关注崩溃时的数据一致性,并且更容易只关注一个Agent,而不是保持其中许多一致。