Warum ist die Ausführung meines Threads anormal, wenn ich Threads in Python nicht explizit aufrufe?

Linda Hamilton
Freigeben: 2024-11-09 15:48:02
Original
277 Leute haben es durchsucht

Why Does My Thread Execution Anomalous When I Don't Explicitly Invoke Threads in Python?

Thread-Ausführungsanomalien: Entmystifizierung vorzeitiger Thread-Aufrufe

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.

Das Problem: Threads ohne expliziten Aufruf ausführen

Bedenken Sie das folgende Code-Snippet:

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

Ü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.

Die Lösung: Das Klammer-Missverständnis verstehen

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()
Nach dem Login kopieren

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")
Nach dem Login kopieren

Handling von Argumenten in Thread-Zielen

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})
Nach dem Login kopieren

oder

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

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage