Python - Pianificazione dei Thread

Ciao a tutti, futuri maestri di Python! Oggi immergeremo nel fascinante mondo della pianificazione dei thread in Python. Non preoccupatevi se siete nuovi alla programmazione; vi guiderò passo per passo in questo viaggio, proprio come ho fatto per innumerevoli studenti durante gli anni della mia docenza. Iniziamo insieme questa avventura entusiasmante!

Python - Thread Scheduling

Comprendere i Thread

Prima di entrare nella pianificazione, ricapitoliamo rapidamente cosa sono i thread. Immagina di leggere un libro stando ad ascoltare musica. Il tuo cervello sta essenzialmente eseguendo due "thread" simultaneamente - uno per la lettura e uno per l'ascolto. In programmazione, i thread funzionano in modo simile, permettendo a un programma di eseguire più compiti contemporaneamente.

Pianificazione dei Thread tramite la Classe Timer

Ora esploreremo il nostro primo metodo di pianificazione dei thread: la classe Timer. È come impostare una sveglia per il tuo codice!

Cos'è la Classe Timer?

La classe Timer fa parte del modulo threading di Python. Permette di pianificare l'esecuzione di una funzione dopo un ritardo specificato. Pensatelo come dire a Python: "Ehi, esegui questa attività per me, ma aspetta un po' prima di iniziare!"

Come Usare la Classe Timer

Guardiamo un esempio semplice:

import threading
import time

def saluta(nome):
print(f"Ciao, {nome}! L'ora è {time.strftime('%H:%M:%S')}")

# Crea un oggetto Timer
t = threading.Timer(5, saluta, args=["Alice"])

# Avvia il timer
t.start()

print("Timer avviato!")

# Attendi che il timer finisca
t.join()

print("Timer completato!")

Spezziamo questo down:

  1. Importiamo i moduli necessari: threading e time.
  2. Definiamo una semplice funzione saluta che stampa un saluto con l'ora corrente.
  3. Creiamo un oggetto Timer, dicendogli di eseguire la funzione saluta dopo un ritardo di 5 secondi, passando "Alice" come argomento.
  4. Avviamo il timer con t.start().
  5. Usiamo t.join() per attendere che il timer completi prima di procedere.

Quando esegui questo codice, vedrai "Timer avviato!" stampato immediatamente, poi dopo una pausa di 5 secondi, vedrai il saluto, seguito da "Timer completato!".

Cancellazione di un Timer

A volte, potrebbe essere necessario cancellare un'attività pianificata. È come decidere che non hai bisogno di quell'allarme dopo tutto. Ecco come farlo:

import threading
import time

def attività():
print("Questa attività non verrà eseguita!")

t = threading.Timer(5, attività)
t.start()

print("Timer avviato, ma lo cancelleremo...")
time.sleep(2)  # Attendi per 2 secondi
t.cancel()  # Cancella il timer
print("Timer cancellato!")

In questo esempio, pianifichiamo un'attività ma poi la cancelliamo prima che abbia possibilità di essere eseguita.

Pianificazione dei Thread tramite il Modulo sched

Ora, alziamo il livello e guardiamo il modulo sched. Se la classe Timer è come una semplice sveglia, il modulo sched è come una completa app di pianificazione!

Cos'è il Modulo sched?

Il modulo sched permette di pianificare più eventi per accadere a specifici momenti. È perfetto quando hai bisogno di una pianificazione più complessa rispetto a un semplice ritardo.

Come Usare il Modulo sched

Guardiamo un esempio:

import sched
import time

# Crea un oggetto scheduler
s = sched.scheduler(time.time, time.sleep)

def stampa_ora(nome):
print(f"Ciao, {nome}! L'ora è {time.strftime('%H:%M:%S')}")

# Pianifica alcuni eventi
s.enter(2, 1, stampa_ora, argument=("Alice",))
s.enter(4, 2, stampa_ora, argument=("Bob",))
s.enter(6, 3, stampa_ora, argument=("Charlie",))

print("Scheduler iniziato!")
s.run()
print("Scheduler completato!")

Spezziamo questo down:

  1. Creiamo un oggetto scheduler usando sched.scheduler().
  2. Definiamo una semplice funzione stampa_ora.
  3. Pianifichiamo tre eventi usando s.enter():
  • Il primo argomento è il ritardo in secondi.
  • Il secondo è la priorità (numeri più bassi = priorità più alta).
  • Il terzo è la funzione da eseguire.
  • La parola chiave argument permette di passare argomenti alla funzione.
  1. Iniziamo lo scheduler con s.run().

Quando esegui questo codice, vedrai i saluti stampati a intervalli di 2 secondi.

Cancellazione degli Eventi Pianificati

Proprio come con Timer, puoi cancellare eventi pianificati in sched:

import sched
import time

s = sched.scheduler(time.time, time.sleep)

def attività(nome):
print(f"Ciao, {nome}!")

evento1 = s.enter(2, 1, attività, argument=("Alice",))
evento2 = s.enter(4, 1, attività, argument=("Bob",))

print("Eventi pianificati. Cancellazione dell'evento di Bob...")
s.cancel(evento2)

s.run()
print("Scheduler completato!")

In questo esempio, pianifichiamo due eventi ma cancelliamo il secondo prima di eseguire lo scheduler.

Confronto tra Timer e sched

Ecco una breve confronto tra i due metodi che abbiamo appreso:

Caratteristica Timer sched
Facilità d'uso Semplice, diretto Più complesso, ma più potente
Eventi multipli Uno alla volta Può pianificare più eventi
Precisione Meno precisa Più precisa
Cancellazione Può essere cancellato prima dell'esecuzione Può essere cancellato in qualsiasi momento
Caso d'uso Ritardi semplici Bisogni di pianificazione complessi

Conclusione

Ed eccoci qui, ragazzi! Abbiamo viaggiato attraverso il mondo della pianificazione dei thread in Python, dalla semplice classe Timer alla più complessa modulo sched. Ricorda, come imparare a cavalcare una bicicletta, padroneggiare questi concetti richiede pratica. Quindi non aver paura di esperimentare e fare errori - è così che impariamo!

Nei miei anni di insegnamento, ho visto studenti passare da principianti assoluti a maestri di Python, e non ho dubbi che puoi fare lo stesso. Continua a programmare, a imparare e, più importante, a divertirti!

Fino alla prossima volta, buon coding!

Credits: Image by storyset