8.16. Riepilogo

Hai percorso l’API di asyncio – i pezzi di cui uno script ha bisogno per eseguire piu lavori in modo concorrente su una singola CPU:

  • Scheduling cooperativo – il modello su cui poggia il resto del modulo. La coroutine in esecuzione ha il loop tutto per se finche non esegue un await; i passaggi avvengono solo in corrispondenza di quegli await.

  • Coroutine e taskasync def definisce un’unita di lavoro; asyncio.create_task() ne schedula una in modo concorrente e restituisce un Task su cui l’applicazione puo in seguito attendere, che puo annullare o identificare.

  • L’event loop – il motore che esegue coroutine e task. asyncio.run() e l’unico punto di ingresso di cui la maggior parte degli script ha bisogno; la classe Loop espone il resto per i rari casi che lo richiedono.

  • Coordinamentogather() per la diramazione e la raccolta, wait_for() per le scadenze, Task.cancel e il pattern di pulizia nella clausola finally, la propagazione delle eccezioni attraverso i task e le chiamate a gather, e l’hook del gestore di eccezioni del loop.

  • Primitive di sincronizzazioneEvent per la segnalazione tra coroutine, Lock per serializzare l’accesso a una risorsa condivisa attraverso gli await, e ThreadSafeFlag per risvegliare un task asyncio da un gestore di interrupt.

  • Oggetti async personalizzati – gli hook del linguaggio che permettono alle classi applicative di integrarsi negli idiomi di asyncio. __await__ per gli oggetti che sono essi stessi il bersaglio di await, __aiter__ / __anext__ per async for, e __aenter__ / __aexit__ per async with.

  • Cattura dei frame – il wrapper che trasforma csi.CSI.snapshot() in una coroutine compatibile con await, cosi che un loop di cattura giri insieme ad altro lavoro asyncio.

  • Insidie – gli await dimenticati, i loop stretti senza yield, le cancellazioni ingerite, lo stato condiviso modificato attraverso gli await, e il resto delle trappole specifiche di asyncio.

Questo e sufficiente per scrivere programmi che mescolano lavoro con la camera, I/O hardware e lavoro concorrente in background sullo stesso loop.

8.16.1. Usare questo riferimento in seguito

Tratta i capitoli su asyncio come materiale di riferimento; tornarci per la struttura di async with o per il comportamento esatto di gather() in caso di fallimento di un fratello e l’uso previsto. La pagina di riferimento del modulo asyncio elenca in un unico posto ogni funzione e classe, quando la domanda e semplicemente «qual e il nome esatto di questa chiamata».

Per primitive piu ricche costruite sopra il modulo – semafori, code, barriere e una sostanziosa raccolta di helper a forma applicativa – il repository peterhinch/micropython-async e la fonte standard mantenuta dalla community.

8.16.2. Dove andare da qui

Il networking e il prossimo grande argomento. asyncio.open_connection(), asyncio.start_server() e la classe Stream sono il modo in cui uno script asyncio dialoga con il resto della rete dall’interno di una coroutine, insieme ai moduli sottostanti network e socket. Tutto cio che hai imparato su await, Task, la cancellazione e le primitive di sincronizzazione si trasferisce direttamente.