8. Asyncio

Până acum, fiecare script din tutorial a fost secvențial – o singură linie rulează la un moment dat, iar un apel care trebuie să aștepte (o citire de senzor, un dus-întors prin rețea, un instantaneu) blochează scriptul până când se termină. Acest lucru funcționează atâta timp cât există un singur lucru de făcut. În momentul în care o aplicație trebuie să facă mai multe lucruri simultan – să ruleze o buclă de instantanee și să răspundă la o comandă serială și să încarce cadre prin rețea – un script secvențial cedează. Primul apel lent oprește orice altceva de la a face progrese.

Modulul asyncio este răspunsul MicroPython. El permite aplicației să descrie mai multe sarcini ca corutine separate și să le ruleze concurent pe un singur fir de execuție, cooperativ – oricare corutină rulează în prezent cedează controlul înapoi planificatorului ori de câte ori trebuie să aștepte. O buclă de instantanee, un cititor UART și un client de rețea pot trăi toate în același script, iar părțile lente ale uneia nu mai îngheață celelalte.

Paginile următoare acoperă cuvintele-cheie async/await și ciclul de viață al Task, coordonarea prin gather() și wait_for(), anularea și propagarea excepțiilor, cele trei primitive de sincronizare încorporate (Event, Lock, ThreadSafeFlag), cârligele de limbaj pentru a conecta clasele aplicației la idiomurile asyncio, un mic înveliș CSI care permite ca snapshot() să ruleze ca o corutină și capcanele frecvente care vin odată cu planificarea cooperativă.

Controlul buclei

Capturarea cadrelor

Capcane

Recapitulare