Ich mache eine Master-Worker-Anwendung. Der Mastercode ist wie folgt. Dieser Code ruft Arbeiter asynchron in start_link
. Sobald die Arbeiter mit ihrer Arbeit fertig sind, melden sie sich unter Verwendung des asynchronen Aufrufs handle_cast
. Danach beabsichtige ich, den Hauptdarsteller auf 'ON' zu halten, damit er die neuen Arbeiter-Schauspieler wieder spawnen kann (wie es in dem ersten Anruf start_link
tat.). Der Meister stoppt jedoch, sobald alle Arbeiter mit ihrer Arbeit fertig sind. Diese stackoverflow Post erwähnt mit rekursiven Aufruf, aber ich bin nicht in der Lage, es mit Genserver
zu tun. Gibt es eine Methode in Genserver
, um es zu erreichen?Elixir: Loop der Schauspieler, um sich selbst zu wiederholen
defmodule Bitcoin.MasterNode do
use GenServer
def start_link(opts) do
{:ok, pid} = GenServer.start_link(__MODULE__,:ok, opts)
start_workers(----perform some task asynchronously----)
{:ok, pid}
end
def set_message(server, name) do
GenServer.cast(server, {:set_message, name})
end
#callbacks
def init(:ok) do
names = []
{:ok, names}
end
def handle_cast({:set_message, name},names) do
names = names ++ name
IO.puts name
{:noreply,names}
end
Ende
Edit: I Anwendung leite auf verteilten Modus heißt, ist Master auch an externe Arbeiter Knoten verbunden. Wenn der Meister stirbt, erlöschen auch die Verbindungen. Die Absicht ist, den Master-Knoten mit der gleichen PID unendlich lange laufen zu lassen.
Bitte verwenden Sie keine Code-Formatierung für Betonung, Verwendung Betonung für die Betonung (überprüfe meine Änderungen, um zu sehen, wie.) – mudasobwa
Sie brauchen keinen rekursiven Aufruf, um einen GenServer am Leben zu erhalten. Ein GenServer bleibt am Leben, bis er explizit gestoppt wird (oder aufgrund eines Fehlers abstürzt). Ich sehe keinen Code in Ihrem Code-Snippet, der den GenServer stoppen würde. Stoppen 'start_workers' diesen GenServer? – Dogbert
"Die Absicht ist, den Master-Knoten mit der gleichen PID unendlich viele Male laufen zu lassen." - Das ist unmöglich. Benutzt stattdessen benannte Server. Bei Serverneustarts werden die Namen nicht geändert. – mudasobwa