Le 24 décembre 2022 à 14:55:50 :
il faudrait que tu expliques précisément ce qui te bloque
le multithreading ?
Oui, en quelque sorte je n'arrive pas a m'imaginer comment implémenter l'algorithme dans le code qu'on a ; en gros voici le code de base qu'on a réalisé dans un tp ultérieure, l'annaux est unidirectionnelle:
NODE.PY ---------------------------------------------------------------------------------------
from Lib import *
from component_node.Part_In import *
from component_node.Part_Out import *
from random import randint
PORT_In =int(sys.argv[1])
Have_Token=int(sys.argv[2]) # 1 si le noeud a le token , 0 sinon !
ID=randint(1,66666)
Leader_ID=ID
Leader_Port=PORT_In
print("Mon ID est : ",ID)
print("Les ports et id du leader sont ",Leader_Port,Leader_ID)
Sd_Out=Part_Out()
Sd_In =Part_In(PORT_In, Have_Token, Sd_Out, Leader_ID)
Sd_In.start()
Sd_Out.port_next_Neighbor =int(input("Numéro de port du voisin: "))
Sd_Out.m=msg
Sd_Out.start()
----------------------------------------------------------------------------------------------------------------
Part_In.PY---------------------------------------------------------------------------------------------
from Lib import *
def Handle_Neighbor(con, add, t, Sortie) :
while True :
if t==0 :
msg = con.recv(1024)
print(msg.decode())
if msg.decode()=="TOKEN":
print(" Vous avez reçu le token")
print(" Vous avez le droit a la parole")
print(" Pour libérer la parole, il faut saisir le mot --TOKEN--")
while True :
expression = input("Vous pouvez vous exprimer : ")
if expression == "TOKEN" :
break
if t==1 :
input("Vous etes l'initiateur du token tapez entrer pour le libere")
Sortie.resume()
t=0
class Part_In(threading.Thread) :
def __init__(self, port, T, S, ID) :
threading.Thread.__init__(self)
self.port = port
self.T = T
self.Sortie =S
self.Leader_Id = ID
self.Leader_Port = port
self.Participant = False
self.ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try :
self.ss.bind(('127.0.0.1',self.port))
except :
print("Le Sd_In n'arrive pas a s'attacher a l'adresse & au numéro de port")
sys.exit()
self.ss.listen()
def run(self) :
self.connexion, self.add = self.ss.accept()
Handle_Neighbor(self.connexion, self.add, self.T, self.Sortie)
PART_OUT.py------------------------------------------------------------------------------------------------------
from Lib import *
class Part_Out(threading.Thread) :
def __init__(self):
threading.Thread.__init__(self)
self.m = message()
self.port_next_Neighbor=0
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__flag = threading.Event()
self.__flag.clear() #set to false
def run(self) :
try:
self.s.connect(('127.0.0.1',self.port_next_Neighbor))
except:
print("La partie OUT n'arrive pas a se connecter au noeud voisin !")
sys.exit()
while True :
self.__flag.wait()
self.s.send(b"TOKEN")
self.__flag.clear()
def resume(self) :
self.__flag.set()
-------------------------------------------------------------------------------------------------------------------------------
Voici tout le code j'ai généré un id aléatoire pour chaque nœud, et dans mes tentative j'ai crée une class message comme celle ci :
class message():
def __init__(self,T="ELECT", IDE=0, PE=0):
self.Type=T
self.Id_Elect=IDE
self.Port_Elect=PE
et je voulais que les nœud s'envoie le message et qu'a chaque réception le nœud compare son id avec la variable Id_Elect de l'message reçu, il la change si nécessaire et puis renvoie le message aux voisin suivant jusqu'a ce qu'un des noeud reçoivent son propre id, des lors il changera le type du message sur ELU et enverra le message a ses voisin pour le informer du noeud élu !
malheureusement j'ai du mal a l'implémenter avec ce multithreading, la séparation entre l'envoie et la réception via des thread ma perdu !
merci pour votre aide et désolé du topic dégelasse 