インスタンス 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
ありがとう