Я создал модуль наблюдения GameSupervisor, который я использую для динамического создания дочернего элемента GameServer (GenServer). Я вижу, что метод start_link GameServer вызывается, когда вызывается функция GameSupervisor.start, но она не поддерживает ожидание pid. Process.alive? (Pid) в iex всегда возвращает false, если стратегия перезапуска установлена на временную. Если я устанавливаю перезапуск на переходный или постоянный, он снова вызывает GameServer.start_link, когда я вызываю GenServer.cast на этом pid.Dynamic Supervisor Spec в Elixir
Вызывается, что 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
Благодаря
Я добавил код. Я не вижу ошибок в iex. – ed1t
Это довольно простой код - трудно понять, как будут возникать ошибки. У вас есть ссылка github? Я счастлив сделать некоторые отладки сегодня вечером. –
На самом деле, я вижу ошибку. «Handle_cast» имеет неправильное возвращаемое значение. http://elixir-lang.org/docs/stable/elixir/GenServer.html#c:handle_cast/2 –