Piszę aplikację Elixir z GenServer, która uruchamia zewnętrzną aplikację podczas startu i zamyka ją, a następnie wykonuje inne prace porządkowe przy wyjściu. Dodałem funkcję uruchamiania w kodzie oddzwonienia i czyszczenia init/1
w wywołaniu zwrotnym .Wdzięczne wyłączenie GenServer
Kod init
działa dobrze, gdy GenServer jest uruchamiany, a metoda terminate
nazywany jest również, gdy sygnał :stop
jest ręcznie wysłany, ale w przypadkach nieprzewidzianych przestojów i przerywa (jak w przypadku uderzenia Ctrl + C) w IEx, kod zakończenia nie jest wywoływany.
Obecnie Poszedłem nad tonami wątków forum, blogach i dokumentacji, w tym:
- Getting Started: GenServers
- Elixir-Lang-Talk: Graceful shutdown of GenServer(s) on exiting iex -S mix
- Elixir-Lang-Talk: Stopping Genserver vs Process.exit
Jeśli
GenServer
odbiera sygnał wyjściowy (to nie jest:normal
) od jakiegokolwiek procesu, gdy nie jest schwytanie wyjścia będzie wyjść nagle z tego samego powodu i tak nie nazywająterminate/2
. Zauważ, że proces kończy domyślnie pułapkę NOT, a sygnał wyjściowy jest wysyłany , gdy połączony proces zakończy się lub jego węzeł zostanie rozłączony.Dlatego nie można zagwarantować, że
terminate/2
zostanie wywołany, gdy zakończy sięGenServer
. Z tego powodu zazwyczaj zalecamy ważne zasady czyszczenia, które mogą się zdarzyć w oddzielnych procesach, albo za pomocą monitoringu lub przez same łącza.
ale nie mam bladego pojęcia, jak dostać :init.stop
, linked processes
lub cokolwiek innego do pracy z tym (ponieważ jest to mój pierwszy raz z GenServers).
To jest mój kod:
defmodule MyAwesomeApp do
use GenServer
def start do
GenServer.start_link(__MODULE__, nil)
end
def init(state) do
# Do Bootup stuff
IO.puts "Starting: #{inspect(state)}"
{:ok, state}
end
def terminate(reason, state) do
# Do Shutdown Stuff
IO.puts "Going Down: #{inspect(state)}"
:normal
end
end
MyAwesomeApp.start
'Process.flag (: trap_exit, true)' nie działa dla mnie. Czy możesz powiedzieć, gdzie powinienem to nazwać w genserverze? – Sheharyar
Powinieneś ustawić to w procesie, co znaczy "init/1" – vfsoraki
Próbowałem, że nie działa. – Sheharyar