Я создал модуль наблюдения GameSupervisor, который использую для динамического создания дочернего элемента экземпляра GameServer (GenServer). Я вижу, что метод start_link GameServer вызывается при вызове функции GameSupervisor.start, но он не поддерживает активный pid. Process.alive? (Pid) в iex всегда возвращает false, если стратегия перезапуска задана как временная. Если я установил временный или постоянный перезапуск, он снова вызывает GameServer.start_link, когда я вызываю GenServer.cast для этого pid.
Не вызывает ли запуск 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
Спасибо