Ausgabe
t1=threading.Thread(target=self.read())
print("something")
t2=threading.Thread(target=self.runChecks(), args=(self,))
self.read
läuft auf unbestimmte Zeit, so dass das Programm niemals die print
Zeile 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?)
Lösung
Aufgrund des Trailings ()
auf dem target=self.read()
führen Sie self.read
den falschen Thread aus, den aktuellen Thread – nicht den neuen Thread, den Sie erstellen – und übergeben den Rückgabewert des self.read
Aufrufs als target
Argument von Thread
. Thread
erwartet, 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 args
verwenden , oder Sie können ein Lambda verwenden. Um beispielsweise in einem Thread zu laufen, könnten Sie verwendenkwargs
threading.Thread
f(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
, b
und c
zum Zeitpunkt der Verwendung, nicht wenn das lambda
definiert 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 start
sofort anrufen).
Beantwortet von – user634175
Antwort geprüft von – Mary Flores (FixError Volunteer)