4

インスタンス GameServer (GenServer) の子を動的に作成するために使用する GameSupervisor 監視モジュールを作成しました。GameSupervisor.start 関数が呼び出されたときに GameServer の start_link メソッドが呼び出されていることがわかりますが、pid は維持されません。再起動戦略が一時的に設定されている場合、iex の Process.alive?(pid) は常に false を返します。再起動を一時的または永続的に設定すると、その pid で GenServer.cast を呼び出すと、GameServer.start_link が再度呼び出されます。

start_child を呼び出しても、pid が監視ツリーに自動的に追加されず、存続しませんか?

GameSupervisor.ex

defmodule Prest.GameSupervisor do

  alias Prest.GameServer
  use Supervisor

  @name :game_sup

  def start_link() do
    IO.puts "start link"
    Supervisor.start_link(__MODULE__, [], [name: @name])
  end

  def start(uid) do
    IO.puts "start bucket"
    {:ok, child} = Supervisor.start_child(@name, [uid])
  end

  def init([]) do
    IO.puts "init sup"
    children = [
      worker(GameServer, [], restart: :transient)
    ]

    supervise(children, strategy: :simple_one_for_one)
  end

end

GameServer.ex

  defmodule Prest.GameServer do
  use GenServer

  # Client API

  def start_link(uid) do
    IO.puts "start game server"
    GenServer.start_link(__MODULE__, uid, [])
  end

  def post(pid, event_id) do
    :gen_server.cast(pid, {:event, event_id})
  end

  # Server API

  def init(uid) do
    {:ok, {uid, [], []}}
  end

  def handle_cast({:event, event_id}, state) do
    #state = [event_id|state]
    {:noreply, "ok", state}
  end
end

ありがとう

4

1 に答える 1