Partage
  • Partager sur Facebook
  • Partager sur Twitter

python: arrêter un thread

    12 mars 2015 à 22:50:19

    Bonjour,
    À chaque fois que j'avance un nouveau problème apparaît.. :)
    Après avoir résolu le nombre max de session ssh; je bloque au problème du trop grand nombre de threads lancés (une centaine)... Je pensais bêtement que la commande "mon_thread._Thread__stop()" suffisait pour les arrêter, mais apparemment ce n'est pas le cas... à partir d'une centaine lancé j'ai l'erreur suivante:
    File "/usr/lib/python2.7/threading.py", line 494, in start     _start_new_thread(self.__bootstrap, ()) error: can't start new thread
    voilà une partie de mon code incriminé:
     def parler_tous(poste):
    			def callback():
    				connecter_ssh(poste)
    				with settings(warn_only=True):
    					run("cvlc {} & echo $! > PIDpt.txt)
    			self.tPt = threading.Thread(target=callback)
    			self.tPt.start()
    
    		def effacer_tous(poste):
    			connecter_ssh(poste)
    			with settings(warn_only=True):
    				run("kill $(cat PIDpt.txt)")
    			self.tPt._Thread__stop()
    Et comme je lance ça sur 10 postes en même temps... Au bout de la dixième fois ça coince...
    J'ai vu ça sur Internet:
    To fix it you will need increase stack size limit in the shell:
    # ulimit -s unlimited
    Initially it was:
    $ ulimit -s
    8192
    déjà ça ne marche pas (le problème est identique) et en plus l'idée ne me plaît qu'à moitié... J'aimerais bien pouvoir arrêter mes threads plutôt que d'en créer à l'infini...
    Pourquoi "self.tPt._Thread__stop()" ne marche pas.
    Merci!
    :)

    -
    Edité par toto5812 12 mars 2015 à 23:00:14

    • Partager sur Facebook
    • Partager sur Twitter
      13 mars 2015 à 1:22:18

      Il faut join() tes threads pour qu'ils soient supprimés pour de bon.

      Par ailleurs, cette histoire de stack size s'applique aux threads POSIX, donc aux threads système, ce qui n'est pas le cas des threads Python, qui sont gérés, créés et ordonnancés par Python dans un seul et même thread système.

      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        13 mars 2015 à 7:18:11

        Bonjour et merci de la réponse,

        Le join() ne va t'il pas attendre que tous les processus a l'intérieur du thread se termine avant de le fermer?

        Car pour certains j'en ai en continu.. Ça ne va pas poser problème ?

        A vrai dire je n'ai pas testé.. J'essaie et je vous tiens au courant!

        • Partager sur Facebook
        • Partager sur Twitter
          13 mars 2015 à 9:14:54

          Les threads ne contiennent pas plusieurs processus. C'est l'inverse. Il faut que le thread ait fini son boulot pour que le join retourne. Cela dit tu peux aussi :

          • join() un thread spécifique sans affecter les autres,
          • n'attendre que pendant une durée déterminée lors du join,
          • ou le terminer de force.

          La doc te dira tout.

          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            14 mars 2015 à 11:36:51

            Bonjour,

            après étude de la doc (merci pour le lien), j'ai remplacé   le  _Thread__stop() par .join(timeout=0)

            Je ne suis pas sûr mais j'ai l'impression que ça marche, en fait je ne peux pas tester à fond ce WE mais de ce que je vois ça à l'air bon...

            Je vous tiens au courant si ce n'est pas le cas.

            Merci

            • Partager sur Facebook
            • Partager sur Twitter
              16 mars 2015 à 12:58:45

              Bon ben, ça me fait la  même erreur... Maintenant que je teste en conditions réelles, ça ne marche pas. Je n'arrive pas à arrêter mes threads... :/
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                16 mars 2015 à 14:49:32

                Je ne travaille pas avec les threads, mais la documentation dit ceci

                documentation

                Python’s Thread class supports a subset of the behavior of Java’s Thread class; currently, there are no priorities, no thread groups, and threads cannot be destroyed, stopped, suspended, resumed, or interrupted. The static methods of Java’s Thread class, when implemented, are mapped to module-level functions.

                Je comprend cela comme des threads qu'on ne peut interrompre, par contre rien n'empêche d'hériter de la classe Thread pour imposer des conditions interrompant le thread, comme le topic de stackoverflow l'indique...

                • Partager sur Facebook
                • Partager sur Twitter

                python: arrêter un thread

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown