Aký je rozdiel medzi architektúrou založenou na udalostiach od spoločnosti Node.js a programovaním s viacerými vláknami v iných jazykoch?


Odpoveď 1:

V paradigme riadenom udalosťami, ako aj vo viacerých vláknach, kód beží vo vnútri procesu operačného systému.

Keď proces spustí viac vlákien, tieto vlákna zdieľajú procesnú pamäť (adresný priestor) na čítanie aj zápis.

JavaScript, ktorý poháňa Node.js, je navrhnutý jednovláknovo. Je zaručené, že každá funkcia sa spustí až do konca a počas tohto procesu sa nespustí žiadny iný kód JavaScript v aktuálnom procese. Prirodzene asynchrónne udalosti (sieť, vstup a výstup na disku, časovače, iné hardvérové ​​a operačné systémy) sú spracované pomocou nástroja, ktorý do funkcie pridáva funkcie JavaScriptu zaregistrované ako obslužné rutiny (alebo spätné volania) pre tieto udalosti do frontu udalostí, ktoré sa majú vykonať po dokončili sa funkcie pred radom.

V paradigme s viacerými vláknami bežia dva alebo viac vlákien paralelne, takže počas funkčného behu môže bežať aj iný kód v inom jadre procesora, prípadne čítania alebo zápisu na rovnaké adresy pamäte. To môže mať za následok nekonzistentný stav pamäte, pokiaľ kód nepoužije špeciálne mechanizmy operačného systému (synchronizačné primitívy) na riadenie prístupu k zdieľanej pamäti.



Odpoveď 2:

Toto je dobrá otázka: „Aký je rozdiel medzi architektúrou založenou na udalostiach od spoločnosti Node.js a programovaním viacerých vlákien v iných jazykoch?“.

Môžeme a mali by sme to trochu prelomiť.

  • Architektúra uzla riadená udalosťami.

Architektúra riadená udalosťami nie je exkluzívna pre Node, napr. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (viac jazykov).

  • Viacvláknové programovanie v iných jazykoch.

Všimnite si, že skript JavaScript nepodporuje viacero vlákien. Podporuje však pracovníkov webových stránok, ktorí, pokiaľ viem, môžu fungovať ako vlákna.

Udalosť tak nie je jedinečná pre Node a viacvláknové procesy sa dajú vykonávať v Node.

Takže tu môžu byť dve otázky: „Aký je rozdiel medzi udalosťami riadenými a viacvláknovými procesmi“ a „Aký je rozdiel medzi uzlom a inými jazykmi (frameworks)“. Zameriam sa na posledný uvedený, pretože to sa zdá byť zámerom otázky.

Povedal by som, že to, čo robí Node výnimočným, je, že ho autor vytvoril s cieľom zabrániť blokovaniu IO pri vytváraní webových aplikácií. Kultúra komunity Node má zdôrazňovať a stavať na sile neblokujúceho IO. Nebudete nájsť príliš veľa knižníc tretích strán, ktoré vykonávajú blokujúce hovory. Ako vývojár používajúci uzol je nepravdepodobné, že by ste v kóde spustili jemné blokovacie operácie. Zatiaľ čo v iných jazykoch by naivný vývojár mohol omylom vykonať vysoko neefektívne blokovacie hovory, napríklad čítanie z pripojenia k databáze.

Okrem toho by ste si mali skutočne prečítať o viacerých modeloch „súbežnosti“ a pochopiť ich výhody a nevýhody. Bonusové body za ocenenie toho, prečo je viaczávitová prevádzka taká dlhá doba prijateľná.



Odpoveď 3:

Koncepčné rozdiely sa dajú ľahko obtočiť.

V architektúre založenej na udalostiach sa váš program spúšťa v nepretržitej jednovláknovej slučke (v uzle môžete vykonať niekoľko vlákien s viacerými vláknami, ale teraz sa toho nemusíte báť). Keď dôjde k udalosti, na zásobníku volaní sa nachádza úloha, ktorá sa má riešiť vo voľnom čase programov.

Viacvláknová architektúra zvyčajne odosiela nové vlákno, keď musí čakať na akciu. Takže zavoláte do databázy a roztočíte nové vlákno, ktoré vykoná všetky potrebné veci a urobí to, čo potrebujete, a uzavrie alebo znovu pripojí pôvodné vlákno.

Obe tieto metódy sú veľmi užitočné pre rôzne veci. Udalosti riadené udalosťou sú vynikajúce pre používateľské rozhranie a servery, pretože váš program nevie, kedy nastane nová udalosť a často sa vyskytnú udalosti. Aj keď je vytváranie závitov nevyhnutné pre výpočtovo ťažké úlohy, kde chcete rozdeliť problém na oveľa menšie kúsky (alebo sa blížite k limitu svojej jedinej závitovej slučky).