8. Asyncio¶
Finora ogni script del tutorial è stato sequenziale – una riga viene eseguita alla volta, e una chiamata che deve attendere (una lettura del sensore, un round-trip di rete, uno snapshot) blocca lo script finché non termina. Funziona finché c’è una sola cosa da fare. Nel momento in cui un’applicazione deve fare più cose contemporaneamente – eseguire un ciclo di snapshot e rispondere a un comando seriale, e caricare frame sulla rete – uno script sequenziale crolla. La prima chiamata lenta impedisce a tutto il resto di avanzare.
Il modulo asyncio è la risposta di MicroPython. Permette all’applicazione di descrivere più attività come coroutine separate e di eseguirle in concorrenza su un singolo thread, in modo cooperativo – la coroutine attualmente in esecuzione cede il controllo allo scheduler ogni volta che deve attendere. Un ciclo di snapshot, un lettore UART e un client di rete possono coesistere nello stesso script, e le parti lente di uno non bloccano più gli altri.
Le pagine che seguono trattano le parole chiave async/await e il ciclo di vita di Task, il coordinamento tramite gather() e wait_for(), l’annullamento e la propagazione delle eccezioni, le tre primitive di sincronizzazione integrate (Event, Lock, ThreadSafeFlag), gli hook del linguaggio per collegare le classi dell’applicazione agli idiomi asyncio, un piccolo wrapper CSI che permette a snapshot() di essere eseguito come coroutine, e le insidie comuni che accompagnano lo scheduling cooperativo.
Coordinamento
Primitive di sincronizzazione
Oggetti async personalizzati
Controllo del loop
Acquisizione dei frame
Insidie
Conclusione