Beim Erstellen von Threads in Python ist es wichtig, sie explizit mit dem Start( aufzurufen ) Methode. In Situationen, in denen die Zielfunktion jedoch innerhalb der Thread-Erstellungssyntax aufgerufen wird, tritt jedoch ein interessantes Problem auf.
Bedenken Sie das folgende Code-Snippet:
t1 = threading.Thread(target=self.read()) print("something") t2 = threading.Thread(target=self.runChecks(), args=(self,))
Überraschenderweise wird die print-Anweisung nie ausgeführt, da self.read auf unbestimmte Zeit ausgeführt wird, wodurch verhindert wird, dass das Programm die nächste Zeile erreicht. Dieses Verhalten erscheint kontraintuitiv, da der Aufruf von t1.start() die Thread-Ausführung einleiten und dem Programm ermöglichen sollte, fortzufahren.
Das Problem liegt in den abschließenden Klammern nach self.read(). In Python rufen Klammern unmittelbar nach einer Funktion diese auf, sodass der folgende Code:
target=self.read()
tatsächlich self.read aufruft und seinen Rückgabewert als Zielargument an Thread übergibt. Allerdings erwartet Thread eine Funktionsreferenz, keinen Rückgabewert. Um das Verhalten zu korrigieren, entfernen Sie einfach die Klammern und rufen Sie t1.start() nach der Thread-Erstellung explizit auf:
t1 = threading.Thread(target=self.read) t1.start() print("something")
Wann Die Zielfunktion erfordert Argumente. Verwenden Sie die Argumente args oder kwargs für threading.Thread. Alternativ können Sie eine Lambda-Funktion verwenden, wie unten gezeigt:
thread = threading.Thread(target=f, args=(a, b), kwargs={'x': c})
oder
thread = threading.Thread(target=lambda: f(a, b, x=c))
Denken Sie daran, dass bei Verwendung eines Lambda die Argumente der Funktion ausgewertet werden, wenn das Lambda aufgerufen wird, nicht wann es ist definiert. Dies kann zu unerwarteten Ergebnissen führen, wenn Variablen vor der Thread-Planung neu zugewiesen werden.
Das obige ist der detaillierte Inhalt vonWarum ist die Ausführung meines Threads anormal, wenn ich Threads in Python nicht explizit aufrufe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!