Synkronisering og Kommunikation
Stryg for at vise menuen
Ved arbejde med tråde eller processer er det ofte nødvendigt at dele data eller koordinere deres handlinger. Uden korrekt synkronisering kan to tråde forsøge at opdatere den samme variabel samtidigt, hvilket fører til uforudsigelige resultater kendt som race conditions. For at forhindre dette tilbyder Python synkroniseringsprimitiver såsom låse, køer og delt hukommelse.
En lås er en simpel mekanisme, der sikrer, at kun én tråd kan få adgang til et stykke kode eller data ad gangen. Hvis én tråd erhverver en lås, må andre tråde, der forsøger at erhverve den, vente, indtil den frigives. Dette forhindrer flere tråde i at foretage modstridende ændringer.
Køer er et andet effektivt værktøj til sikker kommunikation mellem tråde og processer. En kø tillader én tråd eller proces sikkert at indsætte data, mens en anden kan tage dem ud. Klassen queue.Queue (til tråde) og multiprocessing.Queue (til processer) håndterer al nødvendig låsning internt, så du ikke behøver at bekymre dig om race conditions.
Med delt hukommelse kan processer få direkte adgang til de samme data, men du skal bruge synkroniseringsprimitiver som låse eller semaforer for at undgå konflikter. I de fleste tilfælde er det enklere og mere sikkert at bruge køer til kommunikation mellem processer.
Videoen ovenfor viser, hvordan en lås kan forhindre to tråde i at ødelægge delte data, og hvordan en kø kan bruges til sikkert at overføre data mellem samtidige opgaver.
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.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat