8.16. Shrnutí

Prošli jste API knihovny asyncio – součásti, které skript potřebuje k souběžnému spuštění několika úloh na jediném CPU:

  • Kooperativní plánování – model, na němž spočívá zbytek modulu. Běžící korutina má smyčku jen pro sebe, dokud nezavolá await; přepnutí nastávají pouze v těchto await bodech.

  • Korutiny a úlohyasync def definuje jednotku práce; asyncio.create_task() naplánuje jednu souběžně a vrátí Task, na který může aplikace později čekat, zrušit jej nebo identifikovat.

  • Smyčka událostí – engine, který spouští korutiny a úlohy. asyncio.run() je jediný vstupní bod, který většina skriptů potřebuje; třída Loop zpřístupňuje zbytek pro vzácné případy, které jej potřebují.

  • Koordinacegather() pro rozvětvení a sloučení, wait_for() pro časové limity, Task.cancel a vzor úklidu v klauzuli finally, šíření výjimek skrz úlohy a volání gather a hook obslužné rutiny výjimek smyčky.

  • Synchronizační primitivyEvent pro signalizaci mezi korutinami, Lock pro serializaci přístupu ke sdílenému prostředku napříč await body a ThreadSafeFlag pro probuzení asyncio úlohy z obsluhy přerušení.

  • Vlastní async objekty – jazykové háčky, které umožňují aplikačním třídám zapojit se do asyncio idiomů. __await__ pro objekty, které jsou samy cílem await, __aiter__ / __anext__ pro async for a __aenter__ / __aexit__ pro async with.

  • Zachytávání snímků – obal, který mění csi.CSI.snapshot() na korutinu přívětivou pro await, takže smyčka zachytávání běží souběžně s ostatní asyncio prací.

  • Úskalí – zapomenuté await, těsné smyčky bez předání řízení, spolknutá zrušení, sdílený stav měněný napříč await body a zbytek pastí specifických pro asyncio.

To stačí k psaní programů, které na téže smyčce kombinují práci s kamerou, hardwarové I/O a souběžnou práci na pozadí.

8.16.1. Pozdější použití této reference

K asyncio kapitolám přistupujte jako k referenčnímu materiálu; vracet se pro tvar async with nebo přesné chování gather() při selhání sourozence je zamýšlené použití. Referenční stránka modulu asyncio uvádí každou funkci a třídu na jednom místě, když je otázkou jen „jaké je přesné jméno tohoto volání“.

Pro bohatší primitivy postavené nad tímto modulem – semafory, fronty, bariéry a rozsáhlou kolekci pomocníků ve tvaru aplikací – je standardním zdrojem udržovaným komunitou repozitář peterhinch/micropython-async.

8.16.2. Kam dál odsud

Sítě jsou dalším velkým tématem. asyncio.open_connection(), asyncio.start_server() a třída Stream jsou způsoby, jakými asyncio skript zevnitř korutiny komunikuje se zbytkem sítě, společně s moduly network a socket pod nimi. Vše, co jste se naučili o await, Task, rušení a synchronizačních primitivech, se přímo přenáší dál.