Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Synkronisering og kommunikasjon | Multithreading vs. Multiprocessing
Python Strukturert Programmering

Synkronisering og kommunikasjon

Sveip for å vise menyen

Når du arbeider med tråder eller prosesser, må du ofte dele data eller koordinere handlingene deres. Uten riktig synkronisering kan to tråder forsøke å oppdatere den samme variabelen samtidig, noe som fører til uforutsigbare resultater kjent som kappløpsforhold. For å forhindre dette tilbyr Python synkroniseringsprimitiver som låser, køer og delt minne.

En lås er en enkel mekanisme som sikrer at kun én tråd kan få tilgang til et stykke kode eller data om gangen. Hvis én tråd får tak i en lås, må andre tråder som prøver å få tak i den vente til den blir frigitt. Dette forhindrer at flere tråder gjør motstridende endringer.

Køer er et annet kraftig verktøy for sikker kommunikasjon mellom tråder og prosesser. En kø lar én tråd eller prosess trygt legge inn data, mens en annen tar det ut. Klassen queue.Queue (for tråder) og multiprocessing.Queue (for prosesser) håndterer all nødvendig låsing internt, slik at du ikke trenger å bekymre deg for kappløpsforhold.

Med delt minne kan prosesser få direkte tilgang til de samme dataene, men du må bruke synkroniseringsprimitiver som låser eller semaforer for å unngå konflikter. I de fleste tilfeller er det enklere og tryggere å bruke køer for kommunikasjon mellom prosesser.

Videoen ovenfor viser hvordan en lås kan forhindre at to tråder ødelegger delte data, og hvordan en kø kan brukes til å trygt overføre data mellom samtidige oppgaver.

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

Hvilken synkroniseringsprimitiv bør du bruke for å dele data trygt mellom flere tråder i Python?

Velg det helt riktige svaret

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 6

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 3. Kapittel 6
some-alt