8.16. Recapitulare

Ați parcurs API-ul asyncio – componentele de care un script are nevoie pentru a rula mai multe sarcini concurent pe un singur CPU:

  • Planificare cooperativă – modelul pe care se sprijină restul modulului. Corutina în execuție are bucla pentru sine până când execută await; comutările au loc doar la acele await-uri.

  • Corutine și sarciniasync def definește o unitate de lucru; asyncio.create_task() planifică una concurent și returnează un Task pe care aplicația îl poate aștepta ulterior, anula sau identifica.

  • Bucla de evenimente – motorul care rulează corutinele și sarcinile. asyncio.run() este singurul punct de intrare de care au nevoie majoritatea scripturilor; clasa Loop expune restul pentru cazurile rare în care este nevoie.

  • Coordonaregather() pentru distribuire și colectare, wait_for() pentru termene-limită, Task.cancel și tiparul de curățare cu clauza finally, propagarea excepțiilor prin sarcini și apeluri gather, precum și hook-ul gestionarului de excepții al buclei.

  • Primitive de sincronizareEvent pentru semnalizare între corutine, Lock pentru serializarea accesului la o resursă partajată de-a lungul await-urilor și ThreadSafeFlag pentru trezirea unei sarcini asyncio dintr-un gestionar de întrerupere.

  • Obiecte async personalizate – hook-urile de limbaj care permit claselor aplicației să se integreze în idiomurile asyncio. __await__ pentru obiecte care sunt ele însele ținta unui await, __aiter__ / __anext__ pentru async for și __aenter__ / __aexit__ pentru async with.

  • Captura de cadre – wrapper-ul care transformă csi.CSI.snapshot() într-o corutină compatibilă cu await, astfel încât o buclă de captură rulează în paralel cu alte sarcini asyncio.

  • Capcaneawait-uri uitate, bucle strânse fără cedări, anulări înghițite, stare partajată modificată de-a lungul await-urilor și restul capcanelor specifice asyncio.

Acest lucru este suficient pentru a scrie programe care îmbină lucrul cu camera, I/O hardware și lucrul concurent în fundal, pe aceeași buclă.

8.16.1. Folosirea acestei referințe ulterior

Tratați capitolele despre asyncio ca material de referință; revenirea pentru forma lui async with sau comportamentul exact al lui gather() la eșecul unui frate este utilizarea intenționată. Pagina de referință a modulului asyncio listează fiecare funcție și clasă într-un singur loc atunci când întrebarea este doar „care este numele exact al acestui apel”.

Pentru primitive mai bogate construite peste modul – semafoare, cozi, bariere și o colecție substanțială de utilitare orientate spre aplicații – depozitul peterhinch/micropython-async este sursa standard întreținută de comunitate.

8.16.2. Unde să mergeți de aici

Rețelistica este următorul subiect major. asyncio.open_connection(), asyncio.start_server() și clasa Stream sunt modul în care un script asyncio comunică cu restul rețelei din interiorul unei corutine, împreună cu modulele network și socket aflate dedesubt. Tot ce ați învățat despre await, Task, anulare și primitivele de sincronizare se transferă direct mai departe.