2013-08-28 43 views
14

Ich habe viele Python-Skripte gesehen, die Threads in einer Klasse verwenden und viele von ihnen verwenden die threading.Event(). Zum Beispiel:Python Threading mit Event-Objekt

class TimerClass(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.event = threading.Event() 

    def run(self): 
     while not self.event.is_set(): 
      print "something" 
      self.event.wait(120) 

In while Schleife, warum überprüfen sie den Zustand, wenn sie nicht self.event gesetzt?

Antwort

21

Weil jemand anderes es einstellen wird.

Sie in der Regel einen Thread in einem Teil Ihrer Anwendung starten und weiterhin tun, was Sie tun können:

thread = TimerClass() 
thread.start() 
# Do your stuff 

Der Faden hat es Zeug, während Sie Ihre Sachen zu tun. Wenn Sie den Thread beenden möchten, den Sie gerade anrufen:

thread.event.set() 

Und der Thread wird aufhören.

Also die Antwort ist: Ereignis wird in diesem Fall nicht zum Steuern des Threads aus dem Thread-Objekt selbst verwendet. Es wird verwendet, um den Thread von außen zu steuern (von dem Objekt, das den Verweis auf den Thread enthält).

+0

Im Beispiel von OP bedeutet das self.event.wait (120), dass es 120 Sekunden wartet, um die Schleife wiederherzustellen, außer das Ereignis wird gesetzt(), bevor diese 120 Sekunden abgelaufen sind, an diesem Punkt selbs.event. Warten (120) wird zurückgegeben, und im Grunde wird die Schleife beendet, ohne erneut zu drucken? Und wenn das Ereignis nie eingestellt wird(), wird nur "etwas" alles 120 Sekunden gedruckt? – gunit

+1

@gunit Es wird alle 120 Sekunden "etwas" gedruckt, bis das Ereignis eingestellt ist. Wenn das Ereignis eingestellt ist, wird die Schleife beendet. –