Ich habe ein Mix-Projekt mit so einfach wie möglich ein Supervisor und GenServer. Als ich von iex nennen:So führen Sie Elixir Supervisor in escript
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
The: murmeln Aufruf eine Ausnahme auslöst, dann wird die GenServer neu gestartet und die zweite: echo Aufruf ok funktioniert.
Wenn ich den Code auf eine andere Weise ausführen, kann der Supervisor den GenServer nicht neu starten. Zum Beispiel habe ich eine eScript des Projekts mit dem Hauptmodul wie folgt erstellen:
defmodule EchoCmd.Echo do
def main(args) do
EchoCmd.Supervisor.start_link([:Hello])
GenServer.call(:echoserver, :echo)
GenServer.call(:echoserver, :mumble)
GenServer.call(:echoserver, :echo)
end
end
Der: murmeln Aufruf löst eine Ausnahme und die eScript endet ohne Supervisor die GenServer neu zu starten.
Ich habe den Code der Supervisor- und Server-Module nicht angegeben, weil sie funktionieren, wenn sie von iex aufgerufen werden, also schätze ich, dass sie hier nicht benötigt werden.
Habe ich ein konzeptionelles Missverständnis? Ist das nicht möglich oder mache ich etwas falsch?
Ok, nach viel Rumlaufen und Yak Rasieren, das war mein Problem, zusammen mit ungenügend: timer.sleeps. Ich könnte mit einem Noobie-Modus tun, der sie nach allem hinzufügt. Mein Skript stürzt ab: mumble, wenn ich GenServer.start verwende, aber wenn ich GenServer.start_link verwende, meldet es den Fehler und fährt mit einem neugestarteten GenServer fort. Ich habe verstanden, dass es anders herum funktionieren sollte, aber ich werde es nachlesen. Vielen Dank. –