Python - Creazione di un Thread

Ciao, aspiranti programmatori Python! Oggi, esploreremo il mondo avventuroso dei thread. Non preoccupatevi se non avete mai sentito parlare di thread prima – inizieremo dall'inizio e lavoreremo fino alla fine. Alla fine di questo tutorial, creerete thread come un professionista!

Python - Creating a Thread

Cos'sono i Thread?

Prima di iniziare a creare thread, diamo un'occhiata a cosa sono. Immagina di cucinare un pasto complesso. Non fai tutto uno dopo l'altro – potresti avere la pasta in ebollizione su un fornello mentre tagli i verdure sulla tavola da taglio. Questo è simile a come funzionano i thread nella programmazione. Permettono che parti diverse del tuo programma siano eseguite contemporaneamente, rendendo il tuo codice più efficiente.

Creazione di Thread con Funzioni

Il modo più semplice per creare un thread in Python è utilizzare una funzione. Iniziamo con un esempio di base:

import threading
import time

def stampa_numeri():
for i in range(5):
print(f"Numero {i}")
time.sleep(1)

# Crea un thread
thread = threading.Thread(target=stampa_numeri)

# Avvia il thread
thread.start()

print("Il thread principale continua a funzionare")

# Attendi che il thread finisca
thread.join()

print("Il thread è terminato")

Spezziamo questo down:

  1. Importiamo il modulo threading, che fornisce gli strumenti di cui abbiamo bisogno per lavorare con i thread.
  2. Definiamo una semplice funzione stampa_numeri() che stampa numeri da 0 a 4, con una pausa di 1 secondo tra ogni stampa.
  3. Creiamo un thread utilizzando threading.Thread(), specificando la nostra funzione come target.
  4. Avviamo il thread con thread.start().
  5. Il programma principale continua a funzionare, stampando "Il thread principale continua a funzionare".
  6. Utilizziamo thread.join() per attendere che il nostro thread finisca prima di proseguire.

Quando esegui questo, vedrai che "Il thread principale continua a funzionare" viene stampato immediatamente, mentre i numeri vengono stampati in background. Questo è il potere dei thread!

Creazione di Thread Estendendo la Classe Thread

Un altro modo per creare thread è estendere la classe Thread. Questo metodo è utile quando vuoi creare un oggetto thread riutilizzabile. Ecco un esempio:

import threading
import time

class StampaNumeri(threading.Thread):
def __init__(self, nome):
threading.Thread.__init__(self)
self.nome = nome

def run(self):
for i in range(5):
print(f"{self.nome}: Numero {i}")
time.sleep(1)

# Crea due thread
thread1 = StampaNumeri("Thread 1")
thread2 = StampaNumeri("Thread 2")

# Avvia i thread
thread1.start()
thread2.start()

print("Il thread principale continua a funzionare")

# Attendi che entrambi i thread finiscano
thread1.join()
thread2.join()

print("Entrambi i thread sono terminati")

In questo esempio:

  1. Definiamo una classe StampaNumeri che estende threading.Thread.
  2. Sovrascriviamo il metodo __init__ per accettare un nome per il nostro thread.
  3. Sovrascriviamo il metodo run, che viene chiamato quando il thread viene avviato.
  4. Creiamo due istanze della nostra classe StampaNumeri e le avviamo.
  5. Entrambi i thread vengono eseguiti contemporaneamente, stampando i loro numeri.

Questo metodo ci dà più controllo sui nostri thread e ci permette di creare molteplici istanze facilmente.

Creazione di Thread Utilizzando la Funzione start_new_thread()

C'è un terzo modo per creare thread in Python, utilizzando la funzione start_new_thread() del modulo _thread. Tuttavia, questo metodo è considerato di basso livello e non è consigliato per la maggior parte dei casi d'uso. Ecco un esempio per completezza:

import _thread
import time

def stampa_numeri(nome_thread):
for i in range(5):
print(f"{nome_thread}: Numero {i}")
time.sleep(1)

# Avvia due nuovi thread
try:
_thread.start_new_thread(stampa_numeri, ("Thread 1",))
_thread.start_new_thread(stampa_numeri, ("Thread 2",))
except:
print("Errore: impossibile avviare il thread")

# Mantieni vivo il thread principale
time.sleep(6)
print("Il thread principale esce")

Questo metodo è meno flessibile e non fornisce tanto controllo come i metodi precedenti. È anche più difficile attendere che i thread siano completati utilizzando questa approccio.

Confronto dei Metodi di Creazione dei Thread

Ecco un rapido confronto dei tre metodi che abbiamo discusso:

Metodo Pros Cons
Utilizzando Funzioni Semplice da implementare, buono per compiti singoli Meno riutilizzabile, controllo limitato
Estendendo la Classe Thread Riutilizzabile, più controllo, orientato agli oggetti Slightly più complesso da configurare
start_new_thread() Controllo di basso livello Harder to manage, less flexible, not recommended

Conclusione

Congratulazioni! Avete appena fatto i vostri primi passi nel mondo dei thread in Python. Abbiamo coperto tre modi diversi per creare thread, ognuno con le sue vantaggi e casi d'uso. Ricorda, i thread possono rendere i tuoi programmi più efficienti, ma introducono anche complessità. Man mano che continui il tuo viaggio in Python, imparerai di più su quando e come utilizzare i thread in modo efficace.

continua a praticare, e presto sarai in grado di utilizzare i thread come un programmatore esperto. Buon coding!

Credits: Image by storyset