2010-10-14 16 views
2

J'essaye de créer une sorte de classe non-bloquante en python, mais je ne sais pas comment. Je voudrais qu'une classe soit elle-même un thread, détaché du thread principal pour que les autres threads puissent interagir avec lui.Classe non-bloquante en python (Thread détaché)

Dans un petit exemple:

#!/usr/bin/python2.4 

import threading 
import time 

class Sample(threading.Thread): 
    def __init__(self): 
     super(Sample, self).__init__() 
     self.status = 1 
     self.stop = False 

    def run(self): 
     while not(self.stop): 
      pass 

    def getStatus(self): 
     return self.status 

    def setStatus(self, status): 
     self.status = status 

    def test(self): 
     while self.status != 0: 
      time.sleep(2) 

#main 
sample = Sample() 
sample.start() 
sample.test() 
sample.setStatus(0) 
sample.stop() 

Ce que je voudrais est d'avoir l'instance « exemple » en cours d'exécution comme un thread séparé (détaché du principal) si, dans l'exemple, lorsque le fil conducteur atteint sample.test(), sample (et seulement "sample") irait dormir pendant 2 secondes. Pendant ce temps, le thread principal continuerait son exécution et placerait l'état de l'échantillon à 0. Quand au bout de 2 secondes "sample" se réveillerait, il verrait l'état = 0 et quitterait la boucle while.

Le problème est que si je fais cela, la ligne sample.setStatus (0) n'est jamais atteinte (créant une boucle infinie). J'ai nommé les threads, et il s'avère que, ce faisant, test() est exécuté par le thread principal.

Je suppose que je ne comprends pas le filetage en python qui fonctionnent bien ...

Merci à l'avance

Répondre

4

La méthode run() de l'objet est ce qui s'exécute dans un thread séparé. Lorsque vous appelez sample.test(), cela s'exécute dans le thread principal, donc vous obtenez votre boucle infinie.

+0

Oh, sh ** t ... Je vois ... Alors je dois changer la façon dont je pensais ... Merci! – BorrajaX

1

Peut-être quelque chose comme ça?

import threading 
import time 

class Sample(threading.Thread): 
    def __init__(self): 
     super(Sample, self).__init__() 
     self.stop = False 

    def run(self): 
     while not(self.stop): 
      print('hi') 
      time.sleep(.1) 

    def test(self): 
     print('testing...') 
     time.sleep(2) 

#main 
sample = Sample() 
sample.start()  # Initiates second thread which calls sample.run() 
sample.test()  # Main thread calls sample.test 
sample.stop=True # Main thread sets sample.stop 
sample.join()  # Main thread waits for second thread to finish 
+0

Je suppose que cela peut fonctionner, mais j'aimerais avoir quelque chose de plus «élégant» ... Je suppose que je dois changer la structure ... beaucoup. Merci beaucoup! – BorrajaX