2016-03-10 11 views
4

Я создал модуль наблюдения 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 

Благодаря

ответ

3

Согласно the docs:

  • :permanent процесс всегда перезапущен, эв en, если он нормально завершается.
  • A :transient процесс перезапускается, только если он прерывается ненормально.
  • A :temporary процесс никогда не перезапускается.

Более чем вероятно, ваш процесс GameServer сбой по той или иной причине, и диспетчер обрабатывает перезапуск так, как он настроен.

Чтобы отладить это, вы захотите проверить свои журналы (которые могут выводиться только на терминал), чтобы увидеть причину сбоя процесса. Если у вас есть {:ok, pid}, то это, вероятно, не сбой при инициализации, а это значит, что за столкновение лежит статья handle_cast, handle_call или handle_info.

Без кода трудно предложить более конкретную помощь.

В этом случае, похоже, что у вашего handle_cast есть неправильное возвращаемое значение. Это should return{:noreply, state}, но возвращается {:noreply, "ok", state}. Это часто вызвано изменением handle_call на handle_cast и забыванием удалить значение ответа.

+1

Я добавил код. Я не вижу ошибок в iex. – ed1t

+0

Это довольно простой код - трудно понять, как будут возникать ошибки. У вас есть ссылка github? Я счастлив сделать некоторые отладки сегодня вечером. –

+1

На самом деле, я вижу ошибку. «Handle_cast» имеет неправильное возвращаемое значение. http://elixir-lang.org/docs/stable/elixir/GenServer.html#c:handle_cast/2 –

 Смежные вопросы

  • Нет связанных вопросов^_^