lezione 04

asyncio e concorrenza

async/await per tasks paralleli senza blocchi.

livello: intermedio durata: 24 min output: async tasks badge: async runtime

async def

import asyncio

async def ping():
    return "pong"

await

async def main():
    result = await ping()
    print(result)

gather

async def run():
    await asyncio.gather(ping(), ping())

asyncio.run(run())

panoramica

In questo capitolo su asyncio e concorrenza, async/await per tasks paralleli senza blocchi. L'obiettivo è trasformare i concetti in micro-pattern riutilizzabili con esempi piccoli e verificabili.

Lavora in sequenza: leggi, prova, modifica gli snippet e annota i trade-off principali (performance, leggibilità, manutenzione).

badge: async runtime

obiettivi

  • capire e applicare async def in uno scenario reale
  • capire e applicare await in uno scenario reale
  • capire e applicare gather in uno scenario reale
  • riconoscere trade-off tra chiarezza e performance

scheda rapida

def main():
    dati = [1, 2, 3]
    risultati = [x * 2 for x in dati]
    print(risultati)

if __name__ == "__main__":
    main()

Adatta questo scheletro agli esempi della lezione e sostituisci i dati con il tuo dominio.

tips

  • usa un venv per ogni progetto
  • separa logica e I/O
  • mantieni funzioni piccole e nominative
  • non bloccare l'event loop con I/O sincrono
  • usa asyncio.gather per batch
  • limita concorrenza con Semaphore

tip: Se una coroutine usa librerie sincrone, spostala in un thread executor.

mini progetto

Downloader asincrono per 5-10 URL con timeout e retry base.

  • definisci fetch() con await
  • crea una lista di task
  • raccogli risultati con gather
  • gestisci timeout e retry

output atteso: uno script o query ripetibile con risultati verificabili.

checklist

  • ho eseguito gli snippet e controllato l'output
  • ho annotato almeno 2 trade-off
  • ho completato il mini progetto
  • ho salvato un riepilogo personale
start a brief