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.
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.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår