Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Synkronisering och Kommunikation | Multithreading vs. Multiprocessing
Python Strukturell Programmering

Synkronisering och Kommunikation

Svep för att visa menyn

När du arbetar med trådar eller processer behöver du ofta dela data eller samordna deras åtgärder. Utan korrekt synkronisering kan två trådar försöka uppdatera samma variabel samtidigt, vilket leder till oförutsägbara resultat, så kallade race conditions. För att förhindra detta tillhandahåller Python synkroniseringsprimitiver såsom lås, köer och delat minne.

Ett lås är en enkel mekanism som säkerställer att endast en tråd kan komma åt en kodsektion eller data åt gången. Om en tråd tar ett lås måste andra trådar som försöker ta det vänta tills det släpps. Detta förhindrar att flera trådar gör motstridiga ändringar.

Köer är ett annat kraftfullt verktyg för säker kommunikation mellan trådar och processer. En kö gör det möjligt för en tråd eller process att säkert lägga in data, medan en annan tar ut den. Klassen queue.Queue (för trådar) och multiprocessing.Queue (för processer) hanterar all nödvändig låsning internt, så du behöver inte oroa dig för race conditions.

Med delat minne kan processer komma åt samma data direkt, men du måste använda synkroniseringsprimitiver som lås eller semaforer för att undvika konflikter. I de flesta fall är det enklare och säkrare att använda köer för kommunikation mellan processer.

Videon ovan visar hur ett lås kan förhindra att två trådar förstör delad data, och hur en kö kan användas för att säkert överföra data mellan samtidiga uppgifter.

1234567891011121314151617181920212223
import 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.
question mark

Vilken synkroniseringsprimitiv skulle du använda för att säkert dela data mellan flera trådar i Python?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 6

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 3. Kapitel 6
some-alt