8. Asyncio

Jak dotąd każdy skrypt w tym samouczku był sekwencyjny – jedna linia wykonuje się naraz, a wywołanie, które musi poczekać (odczyt z sensora, obieg sieciowy, zrzut obrazu), blokuje skrypt aż do jego zakończenia. Działa to, dopóki jest tylko jedna rzecz do zrobienia. W momencie, gdy aplikacja musi robić kilka rzeczy jednocześnie – uruchamiać pętlę zrzutów obrazu oraz odpowiadać na komendę szeregową, a także przesyłać ramki przez sieć – skrypt sekwencyjny przestaje wystarczać. Pierwsze wolne wywołanie wstrzymuje postęp wszystkiego innego.

Moduł asyncio jest odpowiedzią MicroPython. Pozwala aplikacji opisać kilka zadań jako osobne korutyny i uruchamiać je współbieżnie w pojedynczym wątku, kooperatywnie – aktualnie działająca korutyna oddaje sterowanie z powrotem do harmonogramu zawsze, gdy musi poczekać. Pętla zrzutów obrazu, czytnik UART i klient sieciowy mogą wszystkie żyć w tym samym skrypcie, a wolne fragmenty jednego z nich nie zamrażają już pozostałych.

Kolejne strony omawiają słowa kluczowe async/await oraz cykl życia Task, koordynację poprzez gather() i wait_for(), anulowanie i propagację wyjątków, trzy wbudowane prymitywy synchronizacji (Event, Lock, ThreadSafeFlag), haki językowe pozwalające wpinać klasy aplikacji w idiomy asyncio, niewielki wrapper CSI, który pozwala uruchamiać snapshot() jako korutynę, oraz typowe pułapki towarzyszące harmonogramowaniu kooperatywnemu.

Sterowanie pętlą

Przechwytywanie ramek

Pułapki

Podsumowanie