Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Lavorare con i thread | Multithreading vs. Multiprocessing
Programmazione Strutturale in Python

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.

123456789101112131415161718192021
import 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.

question mark

Quale delle seguenti affermazioni sulla sincronizzazione dei thread in Python è corretta?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 2

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 2
some-alt