2014-02-23 4 views
5

In der Python-Dokumentation zu http://docs.python.org/2/library/threading.html#thread-objects heißt es, dassKann isAlive() direkt nach Aufruf von start() falsch sein, weil der Thread noch nicht gestartet wurde?

[IsAlive()] bis kurz beginnt kurz vor der run() Methode True zurückgibt, nachdem die Methode run()

endet Aber dann die start() -Methode sagt das:

[start()] arrangiert, dass die run() -Methode des Objekts in einem separaten Thread des Steuerelements aufgerufen wird.

Bedeutet dies, wenn ich t.start() anrufen und dann sofort t.isAlive() überprüfen, es ist möglich, dass ich False bekommen konnte, weil der Faden noch nicht begonnen hat?

+0

Ich bezweifle es, es sei denn, der Thread endet sehr, sehr schnell. – Will

+1

@Will: Es kann nicht sehr schnell beendet werden, wenn es noch nicht gestartet ist. Ich glaube nicht, dass diese Frage an der Antwort auf die separate Frage interessiert ist, "Kann es Falsch zurückgeben, weil der Thread beendet ist?", Trotz des Titels :-) –

+0

Ich werde den Titel – dspyz

Antwort

6

Es kann nicht passieren, zumindest nicht in CPython-Implementierung. Das kommt für Thread.start auf den Code von starren (hier aus der Python-3-Quelle, aber es spielt keine Rolle):

def start(self): 
    ... 
    try: 
     _start_new_thread(self._bootstrap,()) 
    except Exception: 
     with _active_limbo_lock: 
      del _limbo[self] 
     raise 
    self._started.wait() 

_start_new_thread() ist in C implementiert, einen neuen Thread starten und self._bootstrap() innerhalb dieses neuen Thread ausgeführt wird. self._bootstrap() ruft wiederum self.run() auf. Wenn das alles ist, dann könnte der aufrufende Thread tatsächlich eine willkürliche Menge an Zeit zurückgeben, bevor run() mit der Ausführung begonnen wird. Aber das:

self._started.wait() 

an den Endblöcken auf einem internen Event. Der Bootstrap-Code setzt die _startedEvent kurz vor dem Aufruf run(), und der Zustand des gleichen Ereignisses ist die Hauptsache isAlive() betrachtet.

+0

Also sollte nicht die Dokumentation sagen "Diese Methode gibt True vom Start zurück() wird aufgerufen, bis die Methode run() endet "? – dspyz

+1

Was die Dokumente sagen, ist korrekt, aber nicht genug, um Ihre Frage zu beantworten. Die von Ihnen vorgeschlagene Änderung würde Ihre Frage beantworten, ist aber nicht korrekt (zB erzeugt Thread A einen Thread T und ruft T.start() auf, T.start() geht gerade, A verliert seine Zeitscheibe, Thread B ruft T. isAlive() und kann sicherlich False zurück bekommen). Es ist schwierig ;-) –

Verwandte Themen