Forum Programmation.python Récupérer une variable retournée par un thread

Posté par  .
Étiquettes : aucune
0
3
avr.
2006
Bonjour à tous,

Je créé en ce moment un programme qui permet de rechercher un login dans un parc informatique. Ce parc est décomposé en 14 salles nommées de "a" à "n". Je fais une recherche brutale ; c'est à dire que je me connecte par ssh sur chaque machine et je regarde si "login" y est.

Pour rendre la recherche plus rapide (il y a 20 postes par salle), je créé un thread par salle. Seulement, il faudrait que je récupère la valeur renvoyé par les threads. Savez-vous comment je pourrais faire ça ?

J'ai essayé ça :

def ThreadchercheLogin(login,salle):
..."""thread cherchant un si un login"""
...pour chaque ordi dans la salle:
......si login est sur ordi:
.........return ordi

le problème, c'est que je n'arrive pas à récupérer la valeur retourné par le thread.

Vous avez une idée ?
  • # stockage retour dans base ou fichier

    Posté par  . Évalué à 1.

    as tu essayer de stocker le retour dans un fichier ?
    ou meme de renvoyer la valeur dans une base de données ...
    je sais c'est usine a gaz comme methode... mais je vois pas d'ou pourrait venir le problème.
  • # ben

    Posté par  (site web personnel) . Évalué à 1.

    Je pense pas qu'il y ait 36 solutions, etant donné que la fin d'un thread n'est pas à proprement parler "prévisible".

    La solution simple serait donc de mettre une variable "retour" au sein de ta classe MonThread(héritant de threading.Thread), et quand tes threads sont tous terminés, tu peux lancer une fonction qui va aller afficher le resultat contenu dans monthread1.retour, monthread2.retour, etc.
    • [^] # Re: ben

      Posté par  . Évalué à 1.

      J'ai bien essayé cette méthode mais ça ne marche pas. Voici le code :

      #######################
      import threading
      class MonThread(threading.Thread):
      --def __init__(self):
      ----threading.Thread.__init__(self)
      ----self.result = None

      --def run(self):
      ----print "bla"
      ----self.result = "bla"

      a = MonThread()
      a.start()
      print "result",a.result
      ########################
      Ca me renvoie :
      result None
      bla

      donc le thread fonctionne bien mais result ne change pas...
  • # Queue

    Posté par  (site web personnel) . Évalué à 2.

    A mon avis, il faut utiliser le module Queue
    http://docs.python.org/lib/module-Queue.html
    C'est fait pour ca.
    Un thread controleur qui crée une queue, demarre les autres et se met en attente de reponses.
    • [^] # Re: Queue

      Posté par  . Évalué à 1.

      Avec les queues ça marche :

      ################################
      import threading
      import Queue
      queue = Queue.Queue(-1)
      def affiche():
      --queue.put("ble")
      a = threading.Thread(target=affiche,args=())
      a.start()
      while queue.qsize() == 0:
      --pass
      print queue.get()
      ################################

      Mais pourquoi ça ne marche pas avec une simple variable ? :

      ################################
      result = None
      def affiche():
      --result = "ble"
      a = threading.Thread(target=affiche,args=())
      a.start()
      while result == None:
      --pass
      print result
      ################################
      ce code tourne à l'infinie. La variable result n'est jamais modifiée. Pourquoi ?

      En tout cas, merci du tuyau
  • # ca va paraitre bete mais ...

    Posté par  . Évalué à 1.

    s'il y a autant de PC, y a surement un serveur de login.

    pourquoi alors ne pas utliser le serveur de login pour savoir si la personne est connecté.

    à l'epoque ou j'etais en université on avait les commandes who/whois/whereis

    qui permettaient de savoir si la personne etait là, qui elle etait et ou elle etait connectée.
    • [^] # Re: ca va paraitre bete mais ...

      Posté par  . Évalué à 1.

      Justement, j'utilise who pour connaitre qui est connecté sur chaque PC. Mais pour cela, il faut que je me logge par ssh sur chaque PC auparavant. Je n'ai pas trouvé dans la page man de who une méthode qui me donne tous les logins connectés sur le réseau...

      Si tu en as une je suis preneur ^^
      • [^] # Re: ca va paraitre bete mais ...

        Posté par  . Évalué à 1.

        comme je le disais cela marche si tu fais ton authentification sur un serveur.

        par contre si les utilisateurs se connectent à partir d'un login/passe fournit sur chaque PC, alors il te faut faire le tour des PC

        maintenant avec ssh et who tu dois pouvoir faire un truc du style :

        pour i de 1 à n
        ssh le_pc_$i && who

        deja ca simplifie ton histoire de thread qui fait des truc compliqué.

        d'autant plus que le ssh login peut etre automatisé en echangeant les clé entre les postes il me semble.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.