簡單Elixir遊戲服設計-桌子進程跑起來

像Player進程那樣增長TableServer表明桌子進程git

增長TableSupervisor監控TableServer。使用同一個Registry,所以名字也改爲LocalRegistry了。數據結構

所以Registry的啓動代碼,以及原來PlayerServer的register_name要作稍微修改。ide

固然你也可使用2個不一樣的Registry,但恐怕就要增長一個RegstrySupervisor 去start_child了,函數

又或者手動啓動2個(更加不建議)。測試

新的game_server.exspa

defmodule GameServer do
  use Application
  def start(_type, _args) do
    children = [
      {Registry, keys: :unique, name: LocalRegistry},
      PlayerSupervisor,
      TableSupervisor
    ]
    Supervisor.start_link(children, strategy: :one_for_one)
  end
end
game_server.ex

PlayerServer 的register_name 應該按table_server 那樣修改,這樣清晰,而且也不會衝突。rest

defmodule TableServer do
    use GenServer, restart: :temporary, start: {__MODULE__, :start_link, []}

    def start_link(table) do
        GenServer.start_link(__MODULE__, table, name: register_name(table))
      end

    def init(table) do
        {:ok, table}
    end

    def register_name(%{} = table), do: register_name(table |> SimpleTable.get_id)
    def register_name(id), do: {:via, Registry, {LocalRegistry, {Table, id}}}

    def exist?(table) do
        key = {Table, table |> SimpleTable.get_id}
        case Registry.lookup(LocalRegistry, key) do
            [{_pid, _}] -> true
            [] -> false
        end
    end

end
table_server.ex

新增了exist? 判斷函數,之後會有用吧。code

原則上當玩家建立了一個牌局後,沒解散以前不容許再建立(固然你能夠改,我只是簡化了)server

table_supervisor 測試blog

defmodule TableSupervisorTest do
    use ExUnit.Case
    doctest PlayerSupervisor

    setup do
        Application.stop(GameServer)
        Application.start(GameServer)
        %{}
    end

    test "測試TableSupervisor啓動TableServer" do
        table1 = SimpleTable.init |> SimpleTable.set_id(1)
        table2 = SimpleTable.init |> SimpleTable.set_id(2)
        assert {:ok, _p1} = TableSupervisor.start_table(table1)
        assert {:ok, _p2} = TableSupervisor.start_table(table2)
        assert TableServer.exist?(table1)
        assert TableServer.exist?(table2)
    end
end

改爲使用exist? 了

player_supervisor_test.exs 也照着修改。

編譯測試ok。

代碼變遷參看git吧。

下回咱們由玩家建立牌局,一步步展開吧。

XXXX,想了下 上句話不對,建立那些跟玩法也沒有關係,先放着,直接起牌局玩纔對。

XXXXX,上句好像也不對,本質上server進程只是轉調用數據結構的操做,所以牌局玩法徹底能夠是數據結構的操做先。

因此下回咱們直接操做數據,進行牌局。

相關文章
相關標籤/搜索