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.
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.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione