[FIXED] Thread beginnt mit der Ausführung, bevor Thread.start aufgerufen wird

Ausgabe

t1=threading.Thread(target=self.read())
print("something")
t2=threading.Thread(target=self.runChecks(), args=(self,))

self.readläuft auf unbestimmte Zeit, so dass das Programm niemals die printZeile erreicht. Wie ist das möglich ohne anzurufen t1.start()? (Auch wenn ich das nenne, sollte es anfangen zu laufen und in die nächste Zeile gehen, oder?)


Siehe auch: Was bedeutet es, wenn die Klammern bei einem Funktionsaufruf weggelassen werden (vorausgesetzt, es sind keine Argumente erforderlich)?

Lösung

Aufgrund des Trailings ()auf dem target=self.read()führen Sie self.readden falschen Thread aus, den aktuellen Thread – nicht den neuen Thread, den Sie erstellen – und übergeben den Rückgabewert des self.readAufrufs als targetArgument von Thread. Threaderwartet, dass eine aufzurufende Funktion übergeben wird, entfernen Sie also einfach die Klammern und denken Sie daran, den Thread zu starten:

t1=threading.Thread(target=self.read)
t1.start()
print("something")

Für Ziele, die Argumente benötigen, können Sie die Argumente und argsverwenden , oder Sie können ein Lambda verwenden. Um beispielsweise in einem Thread zu laufen, könnten Sie verwendenkwargsthreading.Threadf(a, b, x=c)

thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})

oder

thread = threading.Thread(target=lambda: f(a, b, x=c))

Passen Sie jedoch auf, wenn Sie das Lambda auswählen – das Lambda sucht nach f, a, bund czum Zeitpunkt der Verwendung, nicht wenn das lambdadefiniert ist, sodass Sie möglicherweise unerwartete Ergebnisse erhalten, wenn Sie eine dieser Variablen neu zuweisen, bevor der Thread geplant ist (was könnte beliebig lange dauern, auch wenn Sie startsofort anrufen).


Beantwortet von –
user634175


Antwort geprüft von –
Mary Flores (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like