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.

Primitive di sincronizzazione

Controllo del loop

Acquisizione dei frame

Insidie

Conclusione