Vayel / go-make

0 stars 1 forks source link

Cas où il n'y a aucune tâche disponible #6

Closed mean-street closed 6 years ago

mean-street commented 6 years ago

L'idée

mean-street commented 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 ?

ludovic-carre commented 6 years ago

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 .

Vayel commented 6 years ago

@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.

mean-street commented 6 years ago

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 ?

Vayel commented 6 years ago

@Mean-Street j'ai pas tout compris. :( "Pour le réveil", ça désigne mon premier pour mon troisième paragraphe ?