8.16. Összegzés

Végigjártad az asyncio API-ját – azokat a darabokat, amelyekre egy szkriptnek szüksége van ahhoz, hogy egyetlen CPU-n több feladatot futtasson egyidejűleg:

  • Kooperatív ütemezés – az a modell, amelyen a modul többi része nyugszik. A futó korutin egyedül birtokolja a ciklust, amíg await-ol; a váltások csak ezeknél az awaiteknél történnek.

  • Korutinok és feladatok – az async def egy munkaegységet definiál; az asyncio.create_task() egyet egyidejűleg ütemez, és visszaad egy Task objektumot, amelyre az alkalmazás később várakozhat, amelyet megszakíthat, vagy azonosíthat.

  • Az eseményhurok – a motor, amely a korutinokat és feladatokat futtatja. Az asyncio.run() az egyetlen belépési pont, amelyre a legtöbb szkriptnek szüksége van; a Loop osztály a többit teszi elérhetővé azokra a ritka esetekre, amikor szükség van rá.

  • Koordináció – a gather() a szétoszláshoz és összegyűjtéshez, a wait_for() a határidőkhöz, a Task.cancel és a finally-záradékos takarítási minta, a kivételek terjedése a feladatokon és gather hívásokon keresztül, valamint a ciklus kivételkezelő horga.

  • Szinkronizációs primitívek – az Event a korutinok közötti jelzéshez, az Lock egy megosztott erőforrás eléréseinek soros rendezéséhez awaiteken keresztül, és az ThreadSafeFlag egy asyncio feladat felébresztéséhez egy megszakításkezelőből.

  • Egyedi async objektumok – a nyelvi horgok, amelyek lehetővé teszik az alkalmazás osztályainak az asyncio idiómákba való beilleszkedését. Az __await__ azoknak az objektumoknak, amelyek maguk az await célpontjai, az __aiter__ / __anext__ az async for szerkezethez, és az __aenter__ / __aexit__ az async with szerkezethez.

  • Képkocka-rögzítés – a csomagoló, amely a csi.CSI.snapshot() hívást egy await-barát korutinná alakítja, így egy rögzítési ciklus más asyncio munkával együtt fut.

  • Buktatók – elfelejtett await-ok, szoros ciklusok átadások nélkül, elnyelt megszakítások, awaiteken keresztül módosított megosztott állapot, és a többi asyncio-specifikus csapda.

Ennyi elég ahhoz, hogy olyan programokat írj, amelyek kameramunkát, hardveres I/O-t és egyidejű háttérmunkát vegyítenek ugyanazon a cikluson.

8.16.1. Ennek a referenciának a későbbi használata

Kezeld az asyncio fejezeteket referenciaanyagként; az async with alakjáért vagy a gather() egy testvérhiba esetén tanúsított pontos viselkedéséért való visszatérés a szándékolt felhasználás. Az asyncio referenciaoldal egy helyen sorolja fel az összes függvényt és osztályt, amikor a kérdés csak az, hogy „mi ennek a hívásnak a pontos neve”.

A modulra épülő gazdagabb primitívekhez – szemaforok, sorok, korlátok és alkalmazás-alakú segédeszközök jelentős gyűjteménye – a peterhinch/micropython-async tároló a szabványos, közösség által karbantartott forrás.

8.16.2. Merre tovább innen

A hálózatkezelés a következő nagy téma. Az asyncio.open_connection(), az asyncio.start_server() és a Stream osztály az, ahogyan egy asyncio szkript egy korutinon belülről kommunikál a hálózat többi részével, az alattuk lévő network és socket modulokkal együtt. Minden, amit az await-ról, a Task osztályról, a megszakításról és a szinkronizációs primitívekről megtanultál, egyenesen továbbvihető.