2016-12-18 2 views
0

Можно ли иметь в модуле более одного Агента? Например, я создаю игру, и мне нужна оболочка для состояния игры, а также оболочка для состояния пользователей. Пример:Более одного агента в одном модуле

defmodule TicTacToe do 

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

end 

Примеры в документации показывают один Agent.start_link, который заставляет меня думать, что не должно быть больше, чем один агент.

ответ

3

В то время как абсолютно верно иметь столько Agent s, сколько вы хотите (они все еще находятся на расстоянии вытянутой отметки erlang's под капотом,) в этом конкретном случае нет необходимости в двух агентах.

правило большого пальца «не производят лишние серверы.»

одну карту с ключами :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, а не избегать многих из них.

Смежные вопросы