8.16. Podsumowanie

Przeszedłeś przez API asyncio – elementy, których skrypt potrzebuje, aby uruchomić kilka zadań współbieżnie na pojedynczym procesorze:

  • Harmonogramowanie kooperacyjne – model, na którym opiera się reszta modułu. Działająca korutyna ma pętlę wyłącznie dla siebie, dopóki nie wykona await; przełączenia następują tylko w tych miejscach await.

  • Korutyny i zadaniaasync def definiuje jednostkę pracy; asyncio.create_task() planuje jej współbieżne uruchomienie i zwraca obiekt Task, na który aplikacja może później czekać, anulować go lub zidentyfikować.

  • Pętla zdarzeń – silnik uruchamiający korutyny i zadania. asyncio.run() to jedyny punkt wejścia, jakiego potrzebuje większość skryptów; klasa Loop udostępnia resztę dla rzadkich przypadków, które tego wymagają.

  • Koordynacjagather() do rozdzielania i scalania, wait_for() do terminów, Task.cancel i wzorzec sprzątania w klauzuli finally, propagacja wyjątków przez zadania i wywołania gather oraz hak obsługi wyjątków pętli.

  • Prymitywy synchronizacjiEvent do sygnalizacji między korutynami, Lock do serializacji dostępu do współdzielonego zasobu na przestrzeni operacji await oraz ThreadSafeFlag do budzenia zadania asyncio z procedury obsługi przerwania.

  • Niestandardowe obiekty async – haki języka, które pozwalają klasom aplikacji wpiąć się w idiomy asyncio. __await__ dla obiektów, które same są celem await, __aiter__ / __anext__ dla async for oraz __aenter__ / __aexit__ dla async with.

  • Przechwytywanie ramek – wrapper, który zamienia csi.CSI.snapshot() w przyjazną dla await korutynę, dzięki czemu pętla przechwytywania działa obok innej pracy asyncio.

  • Pułapki – zapomniane await, ciasne pętle bez oddawania sterowania, połknięte anulowania, współdzielony stan modyfikowany na przestrzeni operacji await oraz reszta specyficznych dla asyncio pułapek.

To wystarczy, aby pisać programy łączące pracę kamery, wejście/wyjście sprzętu oraz współbieżną pracę w tle na tej samej pętli.

8.16.1. Korzystanie z tego materiału referencyjnego w przyszłości

Traktuj rozdziały o asyncio jako materiał referencyjny; powracanie po kształt async with lub dokładne zachowanie gather() przy awarii zadania siostrzanego jest zamierzonym sposobem użycia. Strona referencyjna modułu asyncio wymienia każdą funkcję i klasę w jednym miejscu, gdy pytanie brzmi po prostu „jak dokładnie nazywa się to wywołanie”.

W przypadku bogatszych prymitywów zbudowanych na bazie modułu – semaforów, kolejek, barier oraz pokaźnego zbioru pomocników o kształcie aplikacyjnym – standardowym, utrzymywanym przez społeczność źródłem jest repozytorium peterhinch/micropython-async.

8.16.2. Dokąd dalej

Sieć to następny duży temat. asyncio.open_connection(), asyncio.start_server() oraz klasa Stream to sposób, w jaki skrypt asyncio komunikuje się z resztą sieci z wnętrza korutyny, wraz z leżącymi pod spodem modułami network i socket. Wszystko, czego nauczyłeś się o await, Task, anulowaniu i prymitywach synchronizacji, przenosi się tu bezpośrednio.