Closed mean-street closed 6 years ago
J'ai pas mal avancé (et push sur la branche waitingSlaves). En gros : quand le slave n'a pas de tâche, il lance un serveur, et le master stocke son adresse. Le slave se met en "veille" : il écoute sur un chan (hasTask) et ça le bloque tant qu'il ne se passe rien. Quand le master a une tâche dispo pour ce slave, il appelle "ReceiveTask" dans slave/server.go. Cette méthode stocke la tâche (du coup j'ai transformé task en variable globale de slave/main.go), et ajoute un booléen au chan. Ça réveille le slave, qui continue alors dans sa boucle infinie et exécute la tâche comme n'importe quelle autre. Vous en pensez quoi ? Sinon vous vous y prenez comment pour tester ces saloperies ? Quelqu'un s'est chauffé sur Simgrid ?
Godlike
On Nov 11, 2017 10:11 AM, "Mean-Street" notifications@github.com wrote:
J'ai pas mal avancé (et push sur la branche waitingSlaves). En gros : quand le slave n'a pas de tâche, il lance un serveur, et le master stocke son adresse. Le slave se met en "veille" : il écoute sur un chan (hasTask) et ça le bloque tant qu'il ne se passe rien. Quand le master a une tâche dispo pour ce slave, il appelle "ReceiveTask" dans slave/server.go. Cette méthode stocke la tâche (du coup j'ai transformé task en variable globale de slave/main.go), et ajoute un booléen au chan. Ça réveille le slave, qui continue alors dans sa boucle infinie et exécute la tâche comme n'importe quelle autre.Envoyé le :10:06Vous en pensez quoi ?
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/Vayel/go-make/issues/6#issuecomment-343651289, or mute the thread https://github.com/notifications/unsubscribe-auth/ARh1rrhxWWkcuxdWo6H9DeCYfqmB5RUxks5s1WSqgaJpZM4QaaZW .
@Mean-Street tu as testé le code ? Il me semble que ça ne fonctionne pas (je n'ai pas testé non plus). Cette ligne est bloquante, donc tu n'atteins jamais le channel. Tu peux regarder sur la branche master
comment j'ai fait. https://github.com/Vayel/go-make/blob/master/master/server.go#L55
Détail : https://github.com/Vayel/go-make/blob/waitingSlaves/slave/main.go#L47. Le port est déjà défini plus haut : https://github.com/Vayel/go-make/blob/waitingSlaves/slave/main.go#L40
Tu envoies la tâche en même temps que tu réveilles l'esclave. Je me demande si on ne devrait pas juste envoyer un message "wake up!" puis laisser l'esclave nous contacter comme il le faisait avant.
Un autre truc : tu retournes des erreurs dans master.ReceiveTask
si tu n'arrives pas à réveiller un esclave. Mais l'erreur est retournée à l'esclave qui a rendu son travail. Cet esclave s'en fiche que tu n'aies pas réussi à en réveiller un autre.
Pour les erreurs et le port, effectivement c'était con, je corrige.
Pour le réveil, la différence c'est qu'il n'y a pas de boucle infinie dans le master, mais il y en a une dans le slave : faut que je puisse bloquer sa boucle infinie et la reprendre. Donc soit je quitte la fonction main(), et je la rappelle quand le master le contacte, soit je bloque le slave dans la boucle. Ça change qqch ?
@Mean-Street j'ai pas tout compris. :( "Pour le réveil", ça désigne mon premier pour mon troisième paragraphe ?
L'idée
Question
Une fois qu'il reçoit une tâche, il ferme son serveur, et on repart dans la boucle infinie (quitte à en redémarrer un 3s plus tard) ? Ou on garde le serveur ? (Ça c'est pas terrible, autant faire ça pour tout le monde dès le début du coup)