Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Sincronizzazione e comunicazione | Multithreading vs. Multiprocessing
Programmazione Strutturale in Python

Sincronizzazione e comunicazione

Scorri per mostrare il menu

Quando si lavora con thread o processi, spesso è necessario condividere dati o coordinare le loro azioni. Senza una corretta sincronizzazione, due thread potrebbero tentare di aggiornare la stessa variabile contemporaneamente, portando a risultati imprevedibili noti come race condition. Per prevenire ciò, Python fornisce primitive di sincronizzazione come lock, queue e shared memory.

Un lock è un meccanismo semplice che garantisce che solo un thread possa accedere a un determinato blocco di codice o dato alla volta. Se un thread acquisisce un lock, gli altri thread che tentano di acquisirlo dovranno attendere che venga rilasciato. Questo impedisce che più thread apportino modifiche in conflitto.

Le queue sono un altro potente strumento per una comunicazione sicura tra thread e processi. Una queue consente a un thread o processo di inserire dati in modo sicuro, mentre un altro li preleva. Le classi queue.Queue (per i thread) e multiprocessing.Queue (per i processi) gestiscono internamente tutti i necessari meccanismi di lock, quindi non è necessario preoccuparsi delle race condition.

Con la shared memory, i processi possono accedere direttamente agli stessi dati, ma è necessario utilizzare primitive di sincronizzazione come lock o semafori per evitare conflitti. Nella maggior parte dei casi, l'uso delle queue è più semplice e sicuro per la comunicazione tra processi.

Il video sopra mostra come un lock possa prevenire che due thread corrompano dati condivisi e come una queue possa essere utilizzata per trasferire dati in modo sicuro tra task concorrenti.

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

Quale primitiva di sincronizzazione useresti per condividere dati in modo sicuro tra più thread in Python?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 6

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 3. Capitolo 6
some-alt