8. Asyncio

Eddig az oktatóanyag minden szkriptje szekvenciális volt – egyszerre egy sor fut, és egy olyan hívás, amelynek várnia kell (egy érzékelő-olvasás, egy hálózati körforduló, egy pillanatkép), blokkolja a szkriptet, amíg be nem fejeződik. Ez addig működik, amíg csak egy dolog van tennivaló. Abban a pillanatban, amikor egy alkalmazásnak egyszerre több dolgot kell tennie – futtatni egy pillanatkép-hurkot és válaszolni egy soros parancsra, és képkockákat feltölteni a hálózaton –, a szekvenciális szkript összeomlik. Az első lassú hívás megakadályozza, hogy bármi más előrehaladjon.

Az asyncio modul a MicroPython válasza erre. Lehetővé teszi, hogy az alkalmazás több feladatot különálló korutinként írjon le, és azokat egyetlen szálon, párhuzamosan, kooperatív módon futtassa – bármelyik korutin is fut éppen, visszaadja a vezérlést az ütemezőnek, amikor várnia kell. Egy pillanatkép-hurok, egy UART-olvasó és egy hálózati kliens mind ugyanabban a szkriptben élhet, és az egyik lassú részei többé nem fagyasztják be a többit.

Az előttünk álló oldalak lefedik az async/await kulcsszavakat és a Task életciklusát, a koordinációt a gather() és wait_for() révén, a megszakítást és a kivételterjedést, a három beépített szinkronizációs primitívet (Event, Lock, ThreadSafeFlag), a nyelvi horgokat, amelyekkel az alkalmazás osztályai beilleszthetők az asyncio-idiómákba, egy kis CSI burkolót, amely lehetővé teszi, hogy a snapshot() korutinként fusson, valamint a kooperatív ütemezéssel együtt járó gyakori buktatókat.

Szinkronizációs primitívek

Hurokvezérlés

Képkocka-rögzítés

Buktatók

Összefoglalás