Utilizzare le Coroutine per la Programmazione Asincrona in Python

by theArchitect
SHARE
Utilizzare le Coroutine per la Programmazione Asincrona in Python
© Guida-HTML5.it

Introduzione

La programmazione asincrona in Python è un potente strumento che permette di gestire operazioni che richiedono tempo, come le chiamate a API o l´accesso a database, senza bloccare l´esecuzione del programma. In questo tutorial, esploreremo come utilizzare le coroutine per implementare la programmazione asincrona in modo efficace. Le coroutine sono funzioni speciali che possono essere sospese e riprese, permettendo di gestire più operazioni contemporaneamente.

Codice completo

import asyncio
import random

async def fetch_data(id):
    """Simula un´operazione di recupero dati con un ritardo casuale."""
    delay = random.uniform(0.5, 2.0)
    print(f"Inizio recupero dati per ID: {id}, attesa di {delay:.2f} secondi.")
    await asyncio.sleep(delay)
    print(f"Dati recuperati per ID: {id}.")
    return f"Dati-{id}"

async def main():
    """Funzione principale che gestisce le coroutine."""
    tasks = []
    for i in range(5):
        tasks.append(fetch_data(i))

    # Attende il completamento di tutte le coroutine
    results = await asyncio.gather(*tasks)
    print("Tutti i dati sono stati recuperati:")
    for result in results:
        print(result)

# Esecuzione del programma
if __name__ == "__main__":
    asyncio.run(main())

Spiegazione

Nel codice sopra, abbiamo definito due funzioni asincrone: fetch_data e main.

  • fetch_data(id): Questa coroutine simula il recupero di dati da una fonte esterna. Utilizza asyncio.sleep per simulare un ritardo casuale, rappresentando il tempo che impiegherebbe a recuperare i dati. Dopo il ritardo, restituisce una stringa contenente i dati recuperati.
  • main(): Questa funzione principale crea un elenco di coroutine da eseguire. Utilizza asyncio.gather per eseguire tutte le coroutine in parallelo e attende che tutte completino la loro esecuzione. Infine, stampa i risultati ottenuti.

La chiamata a asyncio.run(main()) avvia l´esecuzione della funzione principale, gestendo automaticamente il ciclo di eventi necessario per le operazioni asincrone.

Best practice

  • Utilizza asyncio.gather: Quando hai più coroutine da eseguire, asyncio.gather è un modo efficiente per eseguirle in parallelo e raccogliere i risultati.
  • Gestisci i timeout: Anche se non trattato in questo tutorial, è importante gestire i timeout per evitare che le coroutine si blocchino indefinitamente. Puoi utilizzare asyncio.wait_for per impostare un timeout su una coroutine.
  • Evita operazioni bloccanti: Assicurati che le operazioni all´interno delle coroutine siano non bloccanti. Ad esempio, evita di utilizzare funzioni di I/O sincrone che possono bloccare il ciclo di eventi.
  • Documenta le coroutine: Poiché le coroutine possono essere complesse, è utile documentarle con commenti e docstring per chiarire il loro comportamento.

Riepilogo

In questo tutorial, abbiamo esplorato come utilizzare le coroutine in Python per implementare la programmazione asincrona. Abbiamo visto come definire coroutine, eseguirle in parallelo con asyncio.gather e gestire i risultati. La programmazione asincrona è una competenza fondamentale per sviluppatori Python, specialmente quando si lavora con operazioni di rete o I/O che possono richiedere tempo.

Approfondisci con risorse ufficiali

SHARE