Accedi
Accedi

Come usare time.sleep() in Python

Come usare time.sleep() in Python
Hostman Team
Redattore tecnico
Programmazione Python
14.10.2025
Reading time: 8 min

A volte, durante l’esecuzione di un programma, è necessario fare una pausa: attendere il caricamento dei dati, dare tempo all’utente di inserire un input o ridurre il carico sul sistema. Uno dei modi più semplici per farlo in Python è usare la funzione time.sleep(), che sospende l’esecuzione del programma per un intervallo di tempo specificato.

In questo articolo analizzeremo come funziona time.sleep() in Python, le sue caratteristiche e alternative, gli errori più comuni e quando è opportuno utilizzarla nei programmi multithread e asincroni, oppure sostituirla con asyncio.sleep() o altri meccanismi di attesa.

Che cos’è la funzione sleep() in Python?

La funzione sleep() è stata introdotta nella libreria standard di Python per semplificare la creazione di pause nel codice. Fa parte del modulo time e si richiama come time.sleep(), permettendo di sospendere temporaneamente l’esecuzione del programma per un certo numero di secondi.

In pratica, sleep() è utile nei test, per inserire ritardi tra richieste API o intervalli tra messaggi. Tuttavia, non deve essere confusa con strumenti di sincronizzazione dei thread o con operazioni che richiedono precisione temporale elevata — per queste ultime esistono soluzioni più adatte.

Come funziona time.sleep()

La funzione time.sleep() mette in pausa il thread corrente per il numero di secondi specificato. In un programma multithread, gli altri thread continuano a funzionare, mentre quello in cui è stata chiamata la funzione rimane “bloccato” per la durata dell’intervallo.

È importante notare che time.sleep() blocca l’esecuzione del codice in quel punto, ritardando tutte le operazioni successive. Ignorare questo comportamento può portare a riduzioni di prestazioni o addirittura al congelamento dell’interfaccia utente in applicazioni desktop.

Quando si usa time.sleep()

time.sleep() viene utilizzata soprattutto in fase di test o debug, quando è necessario introdurre un breve ritardo — ad esempio per verificare una risposta API o attendere un server. Si usa anche per eseguire script passo dopo passo, dando all’utente il tempo di leggere le informazioni o inserire dati.

Nelle dimostrazioni e nei tutorial, time.sleep() serve a simulare processi più lunghi, e quando si lavora con servizi esterni, evita sanzioni o blocchi dovuti a richieste troppo frequenti. Tuttavia, non è l’unico modo per rallentare l’esecuzione del codice — vediamo alcune alternative.

Come usare time.sleep() in Python

Usare time.sleep() in Python è molto semplice, anche per i principianti. Tuttavia, è utile conoscerne i dettagli, poiché possono influire sulle prestazioni o sul comportamento del programma.

Sintassi di base

Per usare la funzione, importa prima il modulo time:

import time
time.sleep(5)

In questo esempio, il programma “dorme” per 5 secondi. Il parametro passato può essere un numero intero o decimale, permettendo di specificare anche frazioni di secondo.

Sintassi:

time.sleep(seconds)

La funzione non restituisce alcun valore. Sospende semplicemente il thread corrente per la durata indicata.

Esempio: ritardare l’esecuzione del codice

Ecco un piccolo script che stampa messaggi con un intervallo di 2 secondi:

import time
print("First message")
time.sleep(2)
print("Second message")
time.sleep(2)
print("Third message")

Durante l’esecuzione, l’utente vedrà una pausa di 2 secondi tra ogni messaggio. Questo è esattamente come funziona il ritardo con time.sleep(2).

Parametri di time.sleep()

La funzione accetta un solo parametro, ma può essere un intero o un float. Questo la rende flessibile per diverse situazioni.

Passare il tempo in secondi

Nella maggior parte dei casi si passa un numero intero:

time.sleep(10)

Lo script si ferma per 10 secondi, utile per pause lunghe o per limitare la frequenza delle richieste.

Usare frazioni di secondo (millisecondi)

A volte serve una pausa brevissima. Puoi passare un numero con la virgola:

time.sleep(0.5)

Questo crea una pausa di mezzo secondo. Tieni presente che, a causa delle limitazioni del sistema operativo e del timer interno di Python, il ritardo effettivo può essere leggermente più lungo. Per sistemi real-time o ad alta precisione, è meglio usare timer dedicati.

Modi alternativi per introdurre una pausa in Python

Anche se time.sleep() è la soluzione più comune e semplice, esistono alternative più efficaci in determinati contesti, soprattutto quando si gestiscono eventi esterni o più thread.

1. Usare input() per aspettare

Il modo più semplice per fermare un programma è con input(). Questa funzione sospende l’esecuzione finché l’utente non preme Invio o inserisce del testo.

print("Press Enter to continue...")
input()
print("Resuming program execution")

Tecnicamente non è una pausa temporizzata, ma un’attesa di input. Può essere utile durante la debug o negli script interattivi.

2. Usare threading.Event()

Nei programmi multithread, puoi utilizzare un oggetto di sincronizzazione come threading.Event(), che blocca un thread finché non riceve un segnale.

import threading
event = threading.Event()

def worker():
    print("Starting work in thread")
    event.wait()
    print("Event received, resuming work")

thread = threading.Thread(target=worker)
thread.start()

import time
time.sleep(3)
event.set()

In questo caso, il thread rimane bloccato fino alla chiamata di event.set(). È un approccio più flessibile perché permette di “risvegliare” il thread in qualsiasi momento.

3. Usare asyncio.sleep() nei programmi asincroni

In programmazione asincrona (modulo asyncio), si utilizza asyncio.sleep(). A differenza di time.sleep(), non blocca l’intero thread, ma solo la coroutine corrente, consentendo al ciclo di eventi di continuare a eseguire altre attività.

import asyncio

async def main():
    print("Start async work")
    await asyncio.sleep(2)
    print("2 seconds passed, resuming")

asyncio.run(main())

È particolarmente utile quando più funzioni asincrone devono eseguire in parallelo. Se usi time.sleep() in questo contesto, bloccheresti l’intero event loop.

Problemi comuni con time.sleep()

Sebbene time.sleep() sia semplice, un uso improprio può provocare blocchi indesiderati o rallentamenti. È fondamentale capire come influenza il flusso del programma.

Blocco del thread principale

time.sleep() blocca il thread in cui è chiamata. Se viene utilizzata nel thread principale di un’applicazione GUI (come Tkinter o PyQt), l’interfaccia può congelarsi.

💡 Suggerimento:
Usa time.sleep() solo in thread secondari, oppure sostituiscila con asyncio.sleep() per evitare blocchi. Nelle applicazioni grafiche è meglio usare timer come QTimer o after().

Uso in codice multithread e asincrono

In un programma multithread, time.sleep() può essere chiamata separatamente in ogni thread, ma non rilascia automaticamente il Global Interpreter Lock (GIL). La possibilità per altri thread di continuare dipende dal sistema operativo.

Nel codice asincrono, non usare time.sleep() all’interno di un ciclo di eventi (asyncio.run()), poiché lo bloccherebbe completamente. Usa invece asyncio.sleep(), che restituisce il controllo al pianificatore, permettendo l’esecuzione di altre coroutine.

Esempio pratico: interrogare periodicamente un’API

Supponiamo di scrivere uno script che interroga un’API esterna, ma le sue regole impongono un minimo di 30 secondi tra ogni richiesta.

Soluzione con time.sleep():

import time
def poll_api():
    print("Making API request...")
def main():
    while True:
        poll_api()
        time.sleep(30)
if __name__ == "__main__":
    main()

Dopo ogni richiesta, lo script si ferma per 30 secondi, rispettando i limiti.

Alternativa asincrona:

import asyncio
async def poll_api():
    print("Making API request...")
async def main():
    while True:
        await poll_api()
        await asyncio.sleep(30)
if __name__ == "__main__":
    asyncio.run(main())

Questa versione non blocca l’intero programma: altre attività possono eseguire in parallelo nello stesso ambiente asincrono. È una soluzione più efficiente e scalabile.

Conclusione

Gestire pause e ritardi è un aspetto importante nello sviluppo in Python.
time.sleep() è lo strumento più immediato, ma la scelta tra time.sleep(), asyncio.sleep() o altri metodi dipende dall’architettura del progetto.

Raccomandazioni principali:

  • Usa time.sleep() per pause brevi nei test, tra richieste o in dimostrazioni.

  • Evita di bloccare il thread principale nelle applicazioni GUI.

  • Nel codice asincrono, sostituiscila con asyncio.sleep().

  • Nei programmi multithread, ricorda che solo il thread corrente si ferma.

  • Per attendere eventi o input utente, usa threading.Event() o input().
Programmazione Python
14.10.2025
Reading time: 8 min

Simili

Programmazione Python

Come ottenere la lunghezza di una lista in Python

Le liste in Python vengono utilizzate praticamente ovunque. In questo tutorial esamineremo quattro modi per trovare la lunghezza di una lista Python: usando funzioni integrate, la ricorsione e un ciclo. Conoscere la lunghezza di una lista è spesso necessario per iterare su di essa ed eseguire varie operazioni. Funzione len() len() è una funzione integrata di Python per ottenere la lunghezza di una lista. Accetta un solo argomento — la lista stessa — e restituisce un numero intero pari alla sua lunghezza. La stessa funzione funziona anche con altri oggetti iterabili, come le stringhe. Country_list = ["The United States of America", "Cyprus", "Netherlands", "Germany"] count = len(Country_list) print("There are", count, "countries") Output: There are 4 countries Ottenere la lunghezza di una lista con un ciclo È possibile determinare la lunghezza di una lista in Python utilizzando un ciclo for. L’idea è attraversare l’intera lista incrementando un contatore di 1 a ogni iterazione. Inseriamo tutto questo in una funzione separata: def list_length(list): counter = 0 for i in list: counter = counter + 1 return counter Country_list = ["The United States of America", "Cyprus", "Netherlands", "Germany", "Japan"] count = list_length(Country_list) print("There are", count, "countries") Output: There are 5 countries Ottenere la lunghezza di una lista con la ricorsione La stessa operazione può essere eseguita tramite ricorsione: def list_length_recursive(list): if not list: return 0 return 1 + list_length_recursive(list[1:]) Country_list = ["The United States of America", "Cyprus", "Netherlands","Germany", "Japan", "Poland"] count = list_length_recursive(Country_list) print("There are", count, "countries") Output: There are 6 countries Come funziona. La funzione list_length_recursive() riceve una lista come input. Se la lista è vuota, restituisce 0 — la lunghezza di una lista vuota. Altrimenti richiama sé stessa in modo ricorsivo con l’argomento list[1:], una slice della lista originale a partire dall’indice 1 (cioè la lista senza l’elemento in posizione 0). Il risultato di tale chiamata viene sommato a 1. A ogni passo ricorsivo il valore restituito aumenta di uno mentre la lista si riduce di un elemento. Funzione length_hint() La funzione length_hint() si trova nel modulo operator. Questo modulo contiene funzioni analoghe agli operatori interni di Python: addizione, sottrazione, confronto e così via. length_hint() restituisce la lunghezza di oggetti iterabili come stringhe, tuple, dizionari e liste. Funziona in modo simile a len(): from operator import length_hint Country_list = ["The United States of America", "Cyprus", "Netherlands","Germany", "Japan", "Poland", "Sweden"] count = length_hint(Country_list) print("There are", count, "countries") Output: There are 7 countries Nota che length_hint() deve essere importata prima dell’uso. Conclusione In questa guida abbiamo illustrato quattro modi per determinare la lunghezza di una lista in Python. A parità di condizioni, il metodo più efficiente è len(). Gli altri approcci sono principalmente giustificati quando si implementano classi personalizzate simili a una lista.
04 December 2025 · 3 min to read
Rete

Comprendere le richieste HTTP: struttura, metodi ed esempi

HTTP è la chiave della comunicazione su Internet. I metodi del protocollo HTTP permettono ai client di inviare richieste ai server e ai server di inviare risposte. Ogni sito web sul World Wide Web utilizza richieste HTTP, quindi è essenziale comprenderle. Questo articolo analizza il concetto di richieste HTTP, la loro struttura, i metodi più comuni e alcuni esempi pratici per comprendere meglio il funzionamento del web. Che cos’è una richiesta HTTP? Una richiesta HTTP è un messaggio in cui un client — ad esempio un browser — chiede a un host presente su un server una risorsa specifica. I client utilizzano gli URL nelle richieste HTTP per indicare al server quali risorse desiderano recuperare. Componenti di una richiesta HTTP Ogni richiesta HTTP è composta da tre parti: la request line (riga di richiesta) gli header il message body (corpo del messaggio) Request Line La request line è la prima riga di una richiesta HTTP. Serve per iniziare un’azione sul server. Indica il metodo HTTP e la versione del protocollo. Include anche un’URI o un URL. Esempio: GET /index.html HTTP/1.1 Header Gli header seguono immediatamente la request line. Forniscono informazioni aggiuntive dal client al server, come: nome dell’host informazioni sul browser (User-Agent) preferenze linguistiche tipi di contenuto accettati Il server utilizza questi dati per identificare il browser e il sistema operativo del client. Gli header HTTP sono case-sensitive e seguono la sintassi Nome: Valore. Esempio di header: Host: example.com User-Agent: Mozilla/5.0 (...) Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.9 Accept-Encoding: gzip, deflate, br Connection: keep-alive Message Body Il corpo del messaggio è utilizzato per inviare dati al server. È facoltativo: non tutte le richieste HTTP lo includono. Tipicamente viene utilizzato con i metodi POST e PUT. Il server utilizza i dati ricevuti per processare la richiesta. Metodi HTTP comuni Una richiesta HTTP connette un client a un server per svolgere diverse operazioni: recuperare una risorsa inviare dati aggiornare contenuti eliminare risorse I metodi più diffusi sono i seguenti: GET — Recuperare risorse La richiesta GET chiede al server una risorsa. Ogni volta che visiti una pagina web, il browser invia una richiesta GET per ottenere i dati necessari. Caratteristiche: cacheable safe idempotente GET non modifica il contenuto del server, permette solo di leggerlo. POST — Inviare dati POST viene utilizzato per inviare dati al server, ad esempio quando si compila un modulo o si carica un file. Il body contiene i dati inviati. Più richieste POST identiche possono creare risorse multiple sul server. PUT — Aggiornare risorse PUT funziona in modo simile a POST, ma serve per aggiornare dati esistenti. Differenze principali: POST = crea nuovi dati PUT = aggiorna dati esistenti PUT è idempotente, quindi eseguire più volte la stessa richiesta produce sempre lo stesso risultato. DELETE — Rimuovere risorse DELETE chiede al server di eliminare una risorsa. Se l’operazione va a buon fine, il server invia una conferma. DELETE è idempotente. Che cos’è una risposta HTTP? Una risposta HTTP è il messaggio che il server invia al client dopo aver ricevuto una richiesta. Ha una struttura simile a quella della richiesta, con tre parti: status line header message body Status Line Indica: la versione HTTP utilizzata il codice di stato il messaggio corrispondente Header Contengono informazioni quali: data e ora della risposta tipo di contenuto inviato dettagli del server istruzioni di caching Message Body Contiene i dati inviati dal server, come: HTML JSON XML immagini file Codici di stato HTTP e significato I codici HTTP indicano il risultato della richiesta. Ogni codice ha tre cifre; la prima indica la categoria. Codice Descrizione 1xx Risposte informative 2xx Successo — richiesta elaborata correttamente 3xx Reindirizzamento — sono necessarie ulteriori azioni 4xx Errori lato client 5xx Errori lato server HTTP Header e la loro importanza Gli header sono fondamentali per la comunicazione client–server. Essi forniscono informazioni usate per diverse funzioni web. Identificazione dell’host Indica quale dominio è servito dal server. Caching Cache-Control e Expires gestiscono come memorizzare le risposte. Gestione dei cookie Set-Cookie e Cookie gestiscono le sessioni utente. Sicurezza Esempi: Authorization — autenticazione Content-Security-Policy — protezione contro XSS Controllo della risposta Gli header indicano se la richiesta ha avuto successo o no. Esempi pratici di richieste HTTP Questi esempi utilizzano Python e la libreria requests. GET import requests response = requests.get("https://api.example.com/data",                         params={"param1": "value1", "param2": "value2"}) print(response.status_code) print(response.json()) POST import requests url = "https://api.example.com/users" data = {     "username": "newuser",     "email": "newuser@example.com",     "password": "securepassword" } response = requests.post(url, json=data) if response.status_code == 201:     print("User created successfully:", response.json()) else:     print("Error:", response.status_code, response.text) PUT import requests url = "https://api.example.com/users/123" data = {     "username": "updateduser",     "email": "updateduser@example.com" } response = requests.put(url, json=data) if response.status_code == 200:     print("User updated successfully:", response.json()) else:     print("Error:", response.status_code, response.text) DELETE import requests url = "https://api.example.com/users/123" response = requests.delete(url) if response.status_code == 204:     print("User deleted successfully.") else:     print("Error:", response.status_code, response.text) Conclusione Le richieste HTTP svolgono un ruolo fondamentale nelle interazioni web. È quindi essenziale comprendere i vari metodi e il loro funzionamento. Scegliere il metodo più adatto garantisce una comunicazione fluida e migliora l’efficienza delle applicazioni web.
01 December 2025 · 6 min to read
Programmazione Python

Opzioni da riga di comando e analisi degli argomenti con argparse in Python

Le interfacce a riga di comando (CLI) sono uno dei modi più rapidi ed efficaci per interagire con il software. Consentono di eseguire comandi direttamente, garantendo un’esecuzione più veloce e funzionalità avanzate. Gli sviluppatori creano spesso CLI in Python per diverse applicazioni, utility e script di automazione, permettendo così di elaborare dinamicamente l’input dell’utente. È qui che entra in gioco il modulo argparse di Python. Il modulo argparse semplifica la gestione degli input da riga di comando e permette agli sviluppatori di creare strumenti interattivi e facili da usare. Essendo parte della libreria standard, consente di definire, elaborare e validare gli input senza dover scrivere logiche complesse. In questo articolo analizzeremo i concetti principali, esempi utili e funzionalità avanzate del modulo argparse per permetterti di iniziare subito a costruire strumenti CLI solidi. Come utilizzare argparse in Python per le interfacce a riga di comando Passo 1: Importare il modulo Importa il modulo nel tuo script Python: import argparse Questo abilita l’analisi degli argomenti passati dalla riga di comando. Passo 2: Creare un oggetto ArgumentParser La classe ArgumentParser è la classe più essenziale dell’API del modulo argparse. Per usarla, crea un’istanza: parser = argparse.ArgumentParser(description="A Hostman tutorial on Python argparse.") Qui: description spiega cosa fa il programma e viene mostrata quando si esegue --help. Passo 3: Aggiungere input e opzioni Definisci i parametri che il programma accetta tramite add_argument(): parser.add_argument('filename', type=str, help="Name of the file to process") parser.add_argument('--verbose', action='store_true', help="Enable verbose mode") Spiegazione: filename è obbligatorio. --verbose è opzionale e abilita la modalità dettagliata. Passo 4: Analizzare gli input dell’utente Elabora gli argomenti forniti tramite: args = parser.parse_args() I valori elaborati vengono memorizzati come attributi dell’oggetto args. Passo 5: Accedere ai dati elaborati Esempio: print(f"File to process: {args.filename}") if args.verbose:     print("Verbose mode enabled") else:     print("Verbose mode disabled") Esempi di utilizzo della CLI Elaborazione del file senza modalità verbose python3 file.py example.txt Elaborazione del file con modalità verbose python3 file.py example.txt --verbose Mostrare l’aiuto python3 file.py --help Esempi comuni di utilizzo di argparse Esempio 1: Aggiungere valori predefiniti Alcuni argomenti opzionali necessitano di valori predefiniti. In questo esempio, --timeout ha un valore predefinito di 30 secondi: import argparse parser = argparse.ArgumentParser(description="Demonstrating default argument values.") parser.add_argument('--timeout', type=int, default=30, help="Timeout in seconds (default: 30)") args = parser.parse_args() print(f"Timeout value: {args.timeout} seconds") Spiegazione Importazione del modulo Creazione dell’istanza di ArgumentParser Aggiunta dell’argomento --timeout con valore predefinito Parsing tramite parse_args() Caso 1: uso del valore predefinito python file.py Caso 2: valore personalizzato python file.py --timeout 60 Esempio 2: Utilizzare choices Il parametro choices limita un argomento a un insieme di valori validi: parser.add_argument('--mode', choices=['basic', 'advanced'], help="Choose the mode of operation") Caso 1: valore valido python3 file.py --mode basic Caso 2: nessun input python3 file.py Caso 3: valore non valido python3 file.py --mode intermediate Esempio 3: Gestire valori multipli Il parametro nargs='+' consente di accettare più valori come lista: parser.add_argument('--numbers', nargs='+', type=int, help="List of numbers to process") Caso 1: più numeri python3 file.py --numbers 10 20 30 Caso 2: un numero python3 file.py --numbers 5 Caso 3: nessun input python3 file.py Caso 4: input non valido python3 file.py --numbers 10 abc 20 Esempio 4: Argomenti opzionali obbligatori Gli argomenti opzionali (quelli che iniziano con --) non sono obbligatori per impostazione predefinita. Tuttavia, puoi renderli obbligatori usando required=True: parser.add_argument('--config', required=True, help="Path to the configuration file") Caso 1: input valido python3 file.py --config settings.json Caso 2: mancanza dell’argomento obbligatorio python3 file.py Funzionalità avanzate Flag booleani parser.add_argument('--debug', action='store_true', help="Enable debugging mode") Raggruppare argomenti correlati group = parser.add_argument_group('File Operations') group.add_argument('--input', type=str, help="Input file") group.add_argument('--output', type=str, help="Output file") Argomenti mutuamente esclusivi group = parser.add_mutually_exclusive_group() group.add_argument('--json', action='store_true', help="Output in JSON format") group.add_argument('--xml', action='store_true', help="Output in XML format") Conclusione Il modulo argparse semplifica la creazione di CLI affidabili per gestire gli argomenti passati ai programmi Python. Dalle opzioni più semplici alle funzionalità avanzate come choices e nargs, gli sviluppatori possono costruire strumenti potenti, intuitivi e facili da mantenere. Dare nomi chiari agli argomenti e scrivere descrizioni corrette rende gli script più leggibili e manutenzionabili.
25 November 2025 · 5 min to read

Hai domande,
commenti o dubbi?

I nostri professionisti sono disponibili per assisterti in ogni momento,
che tu abbia bisogno di aiuto o non sappia da dove iniziare.
Inviaci un'email
Hostman's Support