Synchronisation und Kommunikation
Swipe um das Menü anzuzeigen
Beim Arbeiten mit Threads oder Prozessen ist es oft notwendig, Daten zu teilen oder deren Aktionen zu koordinieren. Ohne geeignete Synchronisation könnten zwei Threads versuchen, gleichzeitig dieselbe Variable zu aktualisieren, was zu unvorhersehbaren Ergebnissen führt, die als Race Conditions bekannt sind. Um dies zu verhindern, stellt Python Synchronisationsmechanismen wie Locks, Queues und Shared Memory zur Verfügung.
Ein Lock ist ein einfaches Mittel, das sicherstellt, dass immer nur ein Thread auf einen bestimmten Codeabschnitt oder eine bestimmte Datenstruktur zugreifen kann. Wenn ein Thread ein Lock erwirbt, müssen andere Threads warten, bis es wieder freigegeben wird. Dadurch werden widersprüchliche Änderungen durch mehrere Threads verhindert.
Queues sind ein weiteres leistungsfähiges Werkzeug für die sichere Kommunikation zwischen Threads und Prozessen. Eine Queue ermöglicht es einem Thread oder Prozess, Daten sicher einzufügen, während ein anderer sie entnimmt. Die Klasse queue.Queue (für Threads) und multiprocessing.Queue (für Prozesse) übernehmen intern alle notwendigen Sperrmechanismen, sodass keine Race Conditions auftreten können.
Mit Shared Memory können Prozesse direkt auf dieselben Daten zugreifen, allerdings müssen dabei Synchronisationsmechanismen wie Locks oder Semaphore verwendet werden, um Konflikte zu vermeiden. In den meisten Fällen ist die Verwendung von Queues für die Kommunikation zwischen Prozessen einfacher und sicherer.
Das obige Video zeigt, wie ein Lock verhindern kann, dass zwei Threads gemeinsame Daten beschädigen, und wie eine Queue genutzt werden kann, um Daten sicher zwischen parallelen Aufgaben zu übertragen.
1234567891011121314151617181920212223import threading counter = 0 lock = threading.Lock() def increment(): global counter for _ in range(10000): with lock: # Ensuring only one thread enters this block at a time counter += 1 threads = [] for _ in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print("Final counter value:", counter) # Without the lock, the final value would likely be wrong due to race conditions. # With the lock, the result is always correct: 50000.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen