Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Python

Inter-Thread-Kommunikation in Python meistern: Synchronisation & Datenaustausch

Inter-Thread-Kommunikation bezeichnet den Prozess der Ermöglichung von Kommunikation und Synchronisation zwischen Threads innerhalb eines Python-Multithreading-Programms.

Generell teilen sich Threads in Python denselben Speicherbereich innerhalb eines Prozesses, was ihnen erlaubt, Daten auszutauschen und ihre Aktivitäten über gemeinsame Variablen, Objekte und spezialisierte Synchronisationsmechanismen des threading-Moduls zu koordinieren.

Zur Erleichterung der Inter-Thread-Kommunikation stellt das threading-Modul verschiedene Synchronisationsprimitive bereit: Locks, Events, Conditions und Semaphores. In diesem Tutorial lernen Sie, Event- und Condition-Objekte für die Kommunikation zwischen Threads in einem Multithreading-Programm zu nutzen.

Das Event-Objekt

Ein Event-Objekt verwaltet den Zustand eines internen Flags, sodass Threads warten oder setzen können. Es stellt Methoden bereit, um den Flag-Zustand zu steuern, wodurch Threads ihre Aktivitäten basierend auf geteilten Bedingungen synchronisieren können.

Das Flag ist initial false und wird mit set() auf true, mit clear() auf false gesetzt. wait() blockiert, bis das Flag true ist.

Wichtige Methoden des Event-Objekts

Beispiel: Ampel-Simulation

Der Code simuliert Verkehrsfluss, gesteuert durch Ampelzustand (GRÜN/ROT). Zwei Threads: signal_state() setzt/removed das Event periodisch (Signalwechsel), traffic_flow() wartet auf Event und läuft solange es gesetzt ist.

 from threading import Event, Thread import time terminate = False def signal_state(): global terminate while not terminate: time.sleep(0.5) print("Verkehrspolizei gibt GRÜN") event.set() time.sleep(1) print("Verkehrspolizei gibt ROT") event.clear() def traffic_flow(): global terminate num = 0 while num < 10 and not terminate: print("Warte auf GRÜN") event.wait() print("GRÜN ... Verkehr kann fahren") while event.is_set() and not terminate: num += 1 print("Fahrzeug Nr:", num, " überquert Ampel") time.sleep(1) print("ROT ... Verkehr muss warten") event = Event() t1 = Thread(target=signal_state) t2 = Thread(target=traffic_flow) t1.start() t2.start() # Threads nach einiger Zeit beenden time.sleep(5) terminate = True t1.join() t2.join() print("Hauptthread beendet") 

Ausgabe

 Warte auf GRÜN Verkehrspolizei gibt GRÜN GRÜN ... Verkehr kann fahren Fahrzeug Nr: 1 überquert Ampel Verkehrspolizei gibt ROT ROT ... Verkehr muss warten Warte auf GRÜN Verkehrspolizei gibt GRÜN GRÜN ... Verkehr kann fahren Fahrzeug Nr: 2 überquert Ampel Fahrzeug Nr: 3 überquert Ampel Verkehrspolizei gibt ROT Verkehrspolizei gibt GRÜN Fahrzeug Nr: 4 überquert Ampel Verkehrspolizei gibt ROT ROT ... Verkehr muss warten Verkehrspolizei gibt GRÜN Verkehrspolizei gibt ROT Hauptthread beendet 

Das Condition-Objekt

Das Condition-Objekt im threading-Modul bietet einen fortgeschritteneren Synchronisationsmechanismus. Es erlaubt Threads, auf Benachrichtigung eines anderen Threads zu warten, bevor sie fortfahren. Condition-Objekte sind immer mit einem Lock assoziiert und bieten Mechanismen für Signalisierung zwischen Threads.

Syntax

 threading.Condition(lock=None) 

Wichtige Methoden

Beispiel 1: Einfache Benachrichtigung

Thread A wartet auf Benachrichtigung von Thread B. Thread B schläft 2 Sekunden, benachrichtigt dann A.

 from threading import Condition, Thread import time c = Condition() def thread_a(): print("Thread A gestartet") with c: print("Thread A wartet auf Erlaubnis...") c.wait() print("Thread A hat Erlaubnis!") print("Thread A beendet") def thread_b(): print("Thread B gestartet") with c: time.sleep(2) print("Benachrichtige Thread A...") c.notify() print("Thread B beendet") Thread(target=thread_a).start() Thread(target=thread_b).start() 

Ausgabe:

 Thread A gestartet Thread A wartet auf Erlaubnis... Thread B gestartet Benachrichtige Thread A... Thread B beendet Thread A hat Erlaubnis! Thread A beendet 

Beispiel 2: Producer-Consumer mit Condition

Thread t2 führt taskA() aus (erzeugt Zufallszahlen, notifiziert), Thread t1 führt taskB() aus (wartet, konsumiert Zahlen).

 from threading import Condition, Thread import time import random numbers = [] def taskA(c): for _ in range(5): with c: num = random.randint(1, 10) print("Erzeugte Zufallszahl:", num) numbers.append(num) print("Benachrichtigung gesendet") c.notify() time.sleep(0.3) def taskB(c): for i in range(5): with c: print("Warte auf Update") while not numbers: c.wait() print("Erhaltene Zufallszahl", numbers.pop()) time.sleep(0.3) c = Condition() t1 = Thread(target=taskB, args=(c,)) t2 = Thread(target=taskA, args=(c,)) t1.start() t2.start() t1.join() t2.join() print("Fertig") 

Ausgabe:

 Warte auf Update Erzeugte Zufallszahl: 2 Benachrichtigung gesendet Erhaltene Zufallszahl 2 Erzeugte Zufallszahl: 5 Benachrichtigung gesendet Warte auf Update Erhaltene Zufallszahl 5 Erzeugte Zufallszahl: 1 Benachrichtigung gesendet Warte auf Update Erhaltene Zufallszahl 1 Erzeugte Zufallszahl: 9 Benachrichtigung gesendet Warte auf Update Erhaltene Zufallszahl 9 Erzeugte Zufallszahl: 2 Benachrichtigung gesendet Warte auf Update Erhaltene Zufallszahl 2 Fertig 

Python

  1. Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
  2. Python-Pakete: Struktur, Importieren und Best Practices
  3. Python Dictionaries meistern: Syntax, Methoden, Updates, Sortieren & Mergen
  4. Flask vs. Django: Unterschiede, Features & Wahl des richtigen Frameworks
  5. Python round()-Funktion erklärt mit praktischen Beispielen
  6. Python-Typkonvertierung & Casting meistern: Umfassender Leitfaden
  7. Python Lists meistern: Append, Sort, Length & List Comprehensions (Praxis-Guide)
  8. Python Queue: FIFO & LIFO verstehen mit praktischen Beispielen
  9. Python Datei-Handling meistern: Textdateien erstellen, lesen, schreiben und öffnen
  10. Python-Funktionen meistern: Syntax, Typen & praktische Beispiele