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 task –
async defdefinisce un’unita di lavoro;asyncio.create_task()ne schedula una in modo concorrente e restituisce unTasksu 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 classeLoopespone il resto per i rari casi che lo richiedono.Coordinamento –
gather()per la diramazione e la raccolta,wait_for()per le scadenze,Task.cancele il pattern di pulizia nella clausolafinally, la propagazione delle eccezioni attraverso i task e le chiamate a gather, e l’hook del gestore di eccezioni del loop.Primitive di sincronizzazione –
Eventper la segnalazione tra coroutine,Lockper serializzare l’accesso a una risorsa condivisa attraverso gli await, eThreadSafeFlagper 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 diawait,__aiter__/__anext__perasync for, e__aenter__/__aexit__perasync with.Cattura dei frame – il wrapper che trasforma
csi.CSI.snapshot()in una coroutine compatibile conawait, cosi che un loop di cattura giri insieme ad altro lavoro asyncio.Insidie – gli
awaitdimenticati, 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.