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