Je fais une application maître-ouvrier. Le code maître est le suivant. Ce code appelle de manière asynchrone les travailleurs dans start_link
. Une fois que les travailleurs ont terminé leur travail, ils rapportent au maître en utilisant handle_cast
appel asynchrone. Après cela, je l'intention de garder l'acteur maître « ON » afin qu'il puisse se reproduire à nouveau les nouveaux travailleurs acteurs (comme il l'a fait dans le premier appel start_link
.). Cependant, le maître s'arrête une fois que tous les acteurs travailleurs ont terminé leur travail. Ce poste stackoverflow mentionne l'utilisation de l'appel récursif mais je ne suis pas en mesure de le faire avec Genserver
. Y at-il une méthode dans Genserver
pour y parvenir?Elixir: boucle l'acteur pour se réexécuter
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
fin
Edit: Je application fonctionnant sur le mode i.e., maître distribué est également relié à des noeuds de travail externes. Si Master meurt, les connexions s'éteignent également. L'intention est de garder le noeud maître avec le même PID pour exécuter des temps infinis.
S'il vous plaît ne pas utiliser le code mise en forme pour l'accent, l'utilisation emphase pour l'emphase (vérifiez mes éditions pour voir comment.) – mudasobwa
Vous n'avez pas besoin d'appel récursif pour garder un GenServer en vie. Un GenServer restera en vie jusqu'à ce qu'il soit explicitement arrêté (ou il se bloque en raison d'une erreur). Je ne vois aucun code dans votre fragment de code qui ferait arrêter le GenServer. Est-ce que 'start_workers' arrête ce GenServer? – Dogbert
"L'intention est de garder le noeud maître avec le même PID pour exécuter des temps infinis." - C'est impossible. Utilisez des serveurs nommés à la place. Les noms ne sont pas modifiés avec les redémarrages du serveur. – mudasobwa