Asynchrónne programovanie: typy, klasifikácia, princípy programovania, koncept, význam a aplikácia

Asynchrónne programovanie (AS) je forma paralelného programovania, ktorá umožňuje štrukturálnej jednotke systému pracovať oddelene od hlavného toku aplikácií. Po dokončení úlohy upozorní hlavné vlákno, či bola úloha dokončená alebo nie. Takéto programovanie je prospešné, pretože zvyšuje podporovanú šírku pásma, čo ho robí atraktívnym vzhľadom na rastúcu potrebu internetu pre systémy s vysokou škálovateľnosťou.

Asynchrónne programovacie modely

S cieľom spracovať kontinuitu výsledku neblokovacích operácií po ich dokončení boli vytvorené rôzne modely AP. Ich výhody sa hodnotia z hľadiska toho, do akej miery nám umožňujú priblížiť sa k schéme najbližšej k postupnej.

Asynchrónne programovacie modely

Typy modelov AP:

  1. Krokový model pokračovania - sekvenčný krokový model. Toto je najpoužívanejšia asynchrónia v uzle JS. Každá funkcia dostane informácie o tom, ako by mala zvládnuť výsledok úspechu alebo chyby v operácii.
  2. Model udalosti-model udalosti, používa architektúru založenú na udalostiach, ktorá umožňuje neblokujúcim operáciám hlásiť ich dokončenie známkami úspechu alebo neúspechu, vyžaduje koreláciu pre synchronizáciu.
  3. Sľubný model-sľubný model, vysvetlený návratovými hodnotami neblokujúcich operácií bez ohľadu na čas, v ktorom boli prijaté zadané hodnoty úspechu alebo zlyhania.
  4. Model generátora-model generátora. Generátory sa používajú na dočasné vrátenie kontroly volajúcemu programu a následný návrat do podprogramu obnovením stavu v bode, v ktorom bolo jeho vykonanie ukončené.

Architektonické princípy uzla

Napriek tomu, že Node JS nedávno dostal ostrú kritiku týkajúcu sa používania výpočtových cyklov v dôsledku jednovláknového prostredia, jeho filozofia založená na troch silných architektonických princípoch zostáva v dopyte.

JavaScript je svojou povahou asynchrónny, rovnako ako Node. Platforma pre spustenie JavaScriptu na strane servera, uzol.js bol predstavený v roku 2009 pomocou asynchrónneho i/o Modelu riadeného udalosťami, vďaka čomu je efektívny a škálovateľný.

Chat je najtypickejším príkladom aplikácie uzla pre viacerých používateľov.js v reálnom čase. Počnúc IRC pre mnoho proprietárnych a otvorených protokolov na neštandardných portoch bolo možné implementovať všetko v modernom Noje.js s WebSockets spustenými predvolene na rovnakom porte 80, ktorý počúva nové správy odoslané ich klientmi. Na strane klienta je stránka HTML s niekoľkými nakonfigurovanými obslužnými programami, jedna pre tlačidlo "Odoslať", ktoré vyberie správu a odošle ju spoločnosti WebSocket, a druhá, ktorá počúva správy prichádzajúce klientovi. Je zrejmé, že ide o jednoduchý a základný model, ale založený na inej odchýlke zložitosti.

Neaktívny model, ktorý Node JS používa v API na podporu asynchrónneho programovania, je krokom k pokračovaniu. Každá neblokujúca operácia dostane ako posledný parameter funkciu, ktorá obsahuje logiku pokračovania. Bude sa volať po ukončení operácie, a to tak na spracovanie výsledkov v prípade úspechu, ako aj na odstránenie chýb. Funkcia pokračovania vám umožňuje určiť operáciu blokovania, ako má pokračovať po dokončení operácie.

Architektonické princípy uzla

Riadenie sériového toku

Aby bolo možné pokračovať v stanovovaní postupných tokov vykonávania v rámci tohto modelu, je potrebné spojiť každú nasledujúcu funkciu do reťazca ako pokračovanie predchádzajúcej funkcie, kde budú výsledky spracované v prípade úspechu alebo neúspechu. To vedie k diagonalizácii kódu, ktorý sa nazýva pyramída pekla (callback hell), kvôli nedostatku praktickej ovládateľnosti, ak iba počet po sebe nasledujúcich reťazcov rastie minimálne.

Riadenie sériového toku

Paralelizácia-asynchrónne vykonávanie neblokovacích operácií nastáva okamžite, pretože jeho jednoduché volanie sa podľa definície vykonáva na pozadí. Na premenu blokovacích operácií na neblokujúce je potrebný malý proces zapuzdrenia, ktorý spustí operáciu na pozadí.

asynchrónne vykonávanie neblokovacích operácií

Synchronizácia funkcií pokračovania

Vyžaduje reťazec na konci každej paralelnej postupnosti funkcie dokončenia, ktorá aplikuje špecifickú logiku až potom, potvrdzuje sa, že všetky paralelné vetvy sú dokončené. Na implementáciu tejto kontroly sa používajú počítadlové grafy.

Synchronizácia funkcií pokračovania

Príklad použitia pokračovateľov:

  1. Paralelizmus, slučka vám umožňuje vykonávať všetky neblokujúce páry počítania čítania neblokujúcim spôsobom.
  2. Sekvencie, každý čítací pár sa prečíta krokom pokračovacích funkcií.
  3. Synchronizácia, každá paralelná vetva dostane posledné pokračovanie, ktoré vykoná logiku ukončenia hneď, ako je zabezpečené dokončenie všetkých vetiev.

Pokračovanie Knižnice

Existuje veľa knižníc, ktoré môžu pomôcť zjednodušiť život vývojárov pracujúcich s modelom AP. Niektoré z nich sú spojené nielen s AP, ale aj s funkčnou paradigmou, čo je spôsobené tým, že mechanizmy na implementáciu spojení sú v skutočnosti funkčnými výhodami.

Typy knižníc:

  1. Async je možno najznámejšia a najpoužívanejšia Knižnica pre asynchrónne programovanie založené na pokračovateľoch. Ponúka rôzne metódy riadenia prietoku pre neblokujúce funkcie.
  2. Join je implementácia metódy synchronizácie, ktorú možno nájsť v iných jazykoch, ako je C a práca s vláknami. Môže sa použiť aj v sľuboch, aj keď v tomto prípade je jeho použitie menej relevantné.
  3. Fn.js je vynikajúca knižnica, ktorá implementuje rôzne metódy funkčného riadenia. Jeho praktická použiteľnosť v tejto súvislosti súvisí s možnosťami, ktoré poskytuje na generovanie neblokujúcich funkcií a uplatňovanie validácie.

Výhody a nevýhody

Asynchrónne programovanie založené na kontinuátoroch je dobrou voľbou pre situácie s jednoduchou logikou riadenia toku. Zvyčajne sa to týka programov v Node JS, ktoré vám umožňujú definovať neblokujúcu odpoveď na prichádzajúce požiadavky.

Výhody modelu:

  1. Jednoduché schémy žiadostí a odpovedí.
  2. Súlad so schémami funkčného programovania.
  3. Je ľahké pochopiť ako koncepčný mechanizmus.

Nevýhoda:

  1. Ak riadiaca logika nie je dostatočne rozvinutá, proces sa skomplikuje, čo vedie k vytvoreniu kódu s distribuovanou funkčnou logikou, ktorý je ťažko čitateľný, pochopiteľný a udržiavateľný.
  2. Ťažkosti pri definovaní logiky riadenia toku.
  3. Vysoko konfigurovateľné synchronizačné mechanizmy.
  4. Logika riadenia je rozdelená medzi každú neblokujúcu vetvu.

Model riadený udalosťami

Udalosť je signálom v obchodnom ekosystéme. Anatomicky sa zvyčajne skladajú z typu, časovej pečiatky a súboru údajov charakterizujúcich kontext, v ktorom k udalosti došlo. Architektúra udalostí (EDA) poskytuje mechanizmus komunikácie medzi zákazníkmi a dodávateľmi vo vzťahu 1: N A s nominálnym oddelením. Jedným z mnohých použití je odstránenie asynchrónnych problémov so spracovaním údajov.

V centralizovaných architektúrach riadených udalosťami existuje centrálna Sprostredkovateľská komunikačná zbernica, ktorá je zodpovedná za zabezpečenie efektívnosti procesu registrácie počúvajúcich klientov a spúšťania oznámení na žiadosť dodávateľov. Tento mechanizmus umožňuje n: n mohutnosť a schéma sa nazýva PUB / SUB vzor.

V distribuovaných architektúrach riadených udalosťami je každý poskytovateľ zodpovedný za správu predplatného svojich zákazníkov a za zasielanie upozornení, keď dôjde k udalosti. Komunikačný mechanizmus je tiež nominálne oddelený, ale zvyčajne je počet poskytovateľov a klientov 1: N. Táto schéma zodpovedá pozorovanej schéme alebo zdrojom udalostí v žargóne Node JS.

Výpočtová Abstrakcia: Sľub

Výpočtová Abstrakcia: Sľub

Prísľub je výpočtová abstrakcia, ktorá predstavuje záväzok zo strany neblokujúcej operácie volanej na doručenie odpovede volajúcemu programu, keď je výsledok prijatý po dokončení. Sľub je objekt, ktorý poskytuje dve metódy na umožnenie logiky spracovania v prípade úspechu alebo neúspechu.

Spĺňajú jednoduchý životný cyklus, ktorý potrebujete vedieť, aby ste s nimi mohli pracovať. Základná hodnota sľubu spočíva v dvoch princípoch. Po prvé, logika procesu v prípade úspechu alebo neúspechu sa uplatňuje iba raz. A po druhé, logika úspechu alebo neúspechu je zaručená, aj keď je sľub vyriešený predtým, jeho ovládače sú zavedené. Ak je to potrebné, sľub čaká na svojich psovodov, asynchrónnych Programovanie JavaScriptu.

Existujú niekoľkými spôsobmi získajte sľuby, ktoré možno identifikovať ako stavebné vzory, ktoré sa pravidelne objavujú pri používaní tohto modelu. Definícia ES6 obsahuje sľuby a uzol js verzia 0.12 má podporu pre túto špecifikáciu. Okrem toho existuje niekoľko knižníc, ktoré implementujú model promise. Aby bol porovnávací referenčný rámec, bol definovaný štandard Promises a+, ktorý riadi všetky implementácie s objektmi dostupnými v tom čase.

Synchrónne a asynchrónne programovanie

Odporúča sa používať JavaScript API, načítanie všetkých jeho značiek a kód dodávateľa z neho. To zaisťuje najlepšiu kompatibilitu s najväčším počtom predajcov. Toto umiestnenie poskytuje všetkým značkám dodávateľov najväčšiu príležitosť na dokončenie sledovania skôr, ako návštevník prejde na ďalšiu stránku.

Synchrónne načítanie nastane, keď prehliadač musí zastaviť vykresľovanie stránky, aby dokončil vykonanie kódu JavaScript. Ak zistí synchrónnu značku JS, zablokuje zobrazenie stránky, kým sa nedokončí vykonávanie kódu. Je to podobné ako s pomaly sa pohybujúcim nákladným autom na jednoprúdovej ceste, ktoré spomaľuje premávku za ním. Moderné webové stránky sa od tejto metódy vzdialili, pretože predstavujú priame riziko oneskorenia načítania stránky.

Nevýhodou tejto metódy je, že celá stránka je blokovaná od začiatku až do úplného načítania značky. A hoci poskytovatelia značiek uzatvárajú dohody o úrovni služieb počas svojej dodacej lehoty, výkon môže ovplyvniť niekoľko faktorov. Patria sem pomalé časy odozvy súvisiace s dodávateľom, spustenie nepotrebných aplikačných serverov v hybridnom modeli klient-server a pomalý internetový prenos. Ak používateľ načíta značky synchrónne, odporúča sa uistiť sa, že poskytovateľ má čas odozvy 100 milisekúnd (ms) alebo rýchlejší.

Programovanie synchrónne a asynchrónne spracovanie údajov prostredníctvom rozhraní API sú aplikačné programovacie rozhrania, ktoré vracajú údaje pre požiadavky buď okamžite, alebo neskôr. Synchrónne a asynchrónne rozhrania API poskytujú spôsob okamžitých alebo naplánovaných požiadaviek na zdroje, údaje alebo služby, keď sú k dispozícii. Moderná metóda, akceptované pre stránky, spočíva v asynchrónnom načítaní značiek.

Pri tejto metóde sa kód JavaScript spracováva paralelne so zvyškom obsahu stránky. To znamená, že aj keď značka dodávateľa reaguje alebo načítava pomaly, nespomalí zvyšok stránky. Pomocou tohto prístupu môžete nielen oddeliť značky JavaScript načítané nezávisle od seba, asynchrónna metóda minimalizuje vplyv načítania externých súborov JS na proces vykresľovania stránky.

Pochopenie a profilovanie C #

Pochopenie a profilovanie C #

Microsoft a komunita .NET výrazne zjednodušil AP vďaka implementácii asynchrónneho čakania v C #. Najnovšie verzie ASP.NET ho aktívne používa na zlepšenie výkonu. Mnoho nástrojov na monitorovanie a profilovanie výkonu sa snaží udržiavať a vizualizovať výkon asynchrónneho programovania 1C. Stackify Prefix Produkty & Retrace má vynikajúcu podporu pre aplikácie využívajúce C# asynchronizáciu. Najprv musíte pochopiť, ako kód pomocou async awai skutočne funguje" a HttpClient ako príklad.

Pochopenie a profilovanie C #

Pomocou ILSpy môžete vidieť, ako kompilátor prevádza tento kód na stroj AsyncState. Štátny stroj vykonáva všetok zložitý kód pod krytom, čo umožňuje vývojárom písať asynchrónny kód.

HttpClient ako príklad

Profilovanie asynchrónneho programovania v C 5 je ťažké, pretože prechádza vláknami. Tradične sa metóda a všetky volania na jej podriadené metódy vyskytujú v rovnakom vlákne. To uľahčuje pochopenie vzťahu medzi metódami rodiča a dieťaťa. S asynchrónnym kódom je to úplne iný príbeh. Nadradená metóda je spustená v jednom vlákne. Keď sa spustí I / O operácia, kód v tomto vlákne sa skončí. Po dokončení operácie I / O sa kód naďalej vykonáva v novom vlákne. Prepojenie kódu medzi týmito vláknami ako súčasť väčšej transakcie je dosť ťažké.

Aiohttp: klientsky server pre asyncio

Aiohttp - umožňuje používateľom vytvárať asynchrónne servery a klientov. Asynchrónny programovací balík aiohttp funguje pre webové zásuvky klienta a servera. Dokumentácia z tohto príkladu aiohttp sa používa na zachytenie stránky HTML.

Aiohttp: klientsky server pre asyncio

Tento príklad ukazuje, ako stiahnuť jeden alebo viac súborov, a môžete tiež sťahovať súbory prostredníctvom programu. Špecifikuje niekoľko nových prvkov, napríklad asynctimeout. To vám umožní vytvoriť kontextového správcu časového limitu. V dolnej časti kód vytvorí asynchrónnu synchronizačnú slučku a použije ju ako hlavná funkcia.

Vytvorte objekt relácie klienta v hlavnej funkcii asynchrónneho programovania a coroutine a funkciu coroutine, ktorá zhromažďuje adresu URL všetkého, čo robiť stiahnuť. V aplikácii download coroutine vytvorí kontextového správcu, ktorý beží približne X sekúnd. Po tomto počte sekúnd X skončí správca kontextu. Ďalej použite funkciu get () relácie, ktorá nájde objekt odpovede.

Keď vývojár vytvorí atribút obsahu objektu odpovede, vráti aiohttp. StreamReader, ktorý umožňuje používateľovi nahrať súbor v akejkoľvek veľkosti. Hneď ako sa súbor prečíta, zapíše sa na lokálny disk. Potom použite funkciu response() na dokončenie spracovania odpovede. Podľa dokumentácie implicitne volá release(). Asynchrónne programovanie v Pythone je však jednoznačne lepšie. Je lepšie opustiť túto funkciu, aby ste predišli ďalším problémom. Je tu jedna časť, ktorá blokuje časť kódu zapisovaného na disk, zatiaľ čo kód zostáva uzamknutý. Používanie aiohttp - je skutočný spôsob na zlepšenie pracovného toku, kde používatelia nemusia tráviť čas vytváraním servera, sťahovaním odkazov a písaním asynchrónnych súborov, čo skracuje čas vytvárania projektu.

Asynchrónne programovanie vám umožňuje dosiahnuť vyššiu efektivitu softvéru, pretože tok vykonávania nie je blokovaný pre dlhé procesy alebo interakciu používateľa, a to tak pre vývoj aplikácií pre Node, ako aj pre prehliadače.

Články na tému