Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Synchronisatie en Communicatie | Multithreading vs. Multiprocessing
Python Structureel Programmeren

Synchronisatie en Communicatie

Veeg om het menu te tonen

Bij het werken met threads of processen is het vaak nodig om data te delen of hun acties op elkaar af te stemmen. Zonder goede synchronisatie kunnen twee threads proberen om tegelijkertijd dezelfde variabele bij te werken, wat leidt tot onvoorspelbare resultaten die bekendstaan als racecondities. Om dit te voorkomen biedt Python synchronisatieprimitieven zoals locks, queues en gedeeld geheugen.

Een lock is een eenvoudig mechanisme dat ervoor zorgt dat slechts één thread tegelijk toegang heeft tot een stuk code of data. Als één thread een lock verkrijgt, moeten andere threads wachten tot deze wordt vrijgegeven. Dit voorkomt dat meerdere threads conflicterende wijzigingen aanbrengen.

Queues zijn een ander krachtig hulpmiddel voor veilige communicatie tussen threads en processen. Een queue maakt het mogelijk dat één thread of proces veilig data toevoegt, terwijl een ander deze eruit haalt. De klasse queue.Queue (voor threads) en multiprocessing.Queue (voor processen) regelen intern alle benodigde locking, zodat je je geen zorgen hoeft te maken over racecondities.

Met gedeeld geheugen kunnen processen direct toegang krijgen tot dezelfde data, maar je moet synchronisatieprimitieven zoals locks of semaforen gebruiken om conflicten te voorkomen. In de meeste gevallen is het gebruik van queues eenvoudiger en veiliger voor communicatie tussen processen.

De bovenstaande video laat zien hoe een lock kan voorkomen dat twee threads gedeelde data corrumperen, en hoe een queue veilig data kan doorgeven tussen gelijktijdige taken.

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

Welke synchronisatieprimitief zou je gebruiken om veilig data te delen tussen meerdere threads in Python?

Selecteer het correcte antwoord

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 3. Hoofdstuk 6

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 3. Hoofdstuk 6
some-alt