Lavorare con i thread
Scorri per mostrare il menu
Il modulo threading di Python offre un modo semplice ma potente per creare e gestire thread, consentendo l'esecuzione simultanea di più operazioni all'interno di un singolo processo. I thread sono unità di esecuzione leggere che condividono lo stesso spazio di memoria, risultando adatti per attività come operazioni di I/O, attesa di risorse esterne o aggiornamento di interfacce utente.
Il ciclo di vita di un thread generalmente comprende diverse fasi:
- Creazione: un oggetto thread viene istanziato ma non ancora avviato;
- Avvio: viene chiamato il metodo
start()del thread, che lo porta nello stato pronto all'esecuzione; - Esecuzione: il thread esegue la sua funzione target;
- Terminazione: il thread termina l'esecuzione, completando il proprio compito o incontrando un'eccezione non gestita.
La gestione dei thread richiede particolare attenzione alla sincronizzazione, poiché i thread condividono dati e risorse. Senza un'adeguata sincronizzazione, si possono verificare race condition o stati incoerenti. Il modulo threading mette a disposizione primitive come Lock, RLock ed Event per coordinare l'accesso dei thread alle risorse condivise.
Di seguito una tabella che presenta funzioni utili per creare, gestire e sincronizzare thread in modo efficace durante il lavoro con attività concorrenti in Python.
Il seguente esempio mostra come sia possibile creare e avviare più thread utilizzando il modulo threading, consentendo l'esecuzione concorrente di diversi compiti.
123456789101112131415161718192021import threading import time def print_numbers(name): for i in range(1, 4): print(f"Thread {name}: {i}") time.sleep(0.5) # Create thread objects thread1 = threading.Thread(target=print_numbers, args=("A",)) thread2 = threading.Thread(target=print_numbers, args=("B",)) # Start the threads thread1.start() thread2.start() # Wait for both threads to finish thread1.join() thread2.join() print("Both threads have finished.")
Si definisce una funzione, print_numbers, che stampa una sequenza di numeri insieme al nome del thread. Quando si crea ciascun thread, si passano gli argomenti utilizzando il parametro args: in questo caso, ogni thread riceve un nome diverso ("A" o "B") per distinguere facilmente i rispettivi output. Chiamando il metodo start(), entrambi i thread iniziano l'esecuzione e vengono eseguiti in modo concorrente. La chiamata a time.sleep(0.5) all'interno del ciclo simula un ritardo nell'esecuzione, consentendo ai thread di alternare i propri output e rendendo evidente che entrambi sono attivi contemporaneamente. Il metodo join() viene poi utilizzato per attendere che entrambi i thread terminino prima di proseguire, assicurando che il programma principale non finisca prematuramente. Questo approccio permette di eseguire i task in parallelo, sfruttando in modo efficiente i tempi di attesa e abilitando l'esecuzione concorrente all'interno di un singolo processo.
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