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 zadania –
async defdefiniuje jednostkę pracy;asyncio.create_task()planuje jej współbieżne uruchomienie i zwraca obiektTask, 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; klasaLoopudostępnia resztę dla rzadkich przypadków, które tego wymagają.Koordynacja –
gather()do rozdzielania i scalania,wait_for()do terminów,Task.canceli wzorzec sprzątania w klauzulifinally, propagacja wyjątków przez zadania i wywołania gather oraz hak obsługi wyjątków pętli.Prymitywy synchronizacji –
Eventdo sygnalizacji między korutynami,Lockdo serializacji dostępu do współdzielonego zasobu na przestrzeni operacji await orazThreadSafeFlagdo 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ą celemawait,__aiter__/__anext__dlaasync fororaz__aenter__/__aexit__dlaasync with.Przechwytywanie ramek – wrapper, który zamienia
csi.CSI.snapshot()w przyjazną dlaawaitkorutynę, 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.