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

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.

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 synkroniseringsprimitive ville du bruge til sikkert at dele data mellem flere tråde i Python?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 6

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 3. Kapitel 6
some-alt