Jaký je rozdíl mezi architekturou Node.js řízenou událostmi a vícevláknovým programováním v jiných jazycích?


Odpověď 1:

V paradigmatu řízeném událostmi i ve více vláknech se kód spustí v procesu operačního systému.

Když proces spustí více podprocesů, sdílí tato vlákna procesní paměť (adresní prostor) pro čtení i zápis.

JavaScript, který pohání Node.js, je navržen jako jednovláknový. Je zaručeno, že každá funkce bude spuštěna do dokončení a během tohoto běhu funkce nebude spuštěn žádný jiný kód JavaScript v aktuálním procesu. Přirozeně asynchronní události (síť, vstup a výstup disku, časovače, další hardware a události operačního systému) jsou zpracovávány modulem, který přidává funkce JavaScriptu registrované jako popisovače (nebo zpětná volání) pro tyto události do fronty smyček událostí, které mají být provedeny po funkce před frontou skončily.

V paradigmatu s více vlákny běží dva nebo více vláken paralelně, takže během funkčního běhu může také běžet jiný kus kódu na jiném jádru procesoru, případně čtení nebo zápis na stejné adresy paměti. To může mít za následek nekonzistentní stav paměti, pokud kód nepoužívá speciální mechanismy operačního systému (synchronizační primitiva) pro řízení přístupu ke sdílené paměti.



Odpověď 2:

To je dobrá otázka: „Jaký je rozdíl mezi architekturou Node.js řízenou událostmi a vícevláknovým programováním v jiných jazycích?“.

Můžeme a měli bychom to trochu rozebrat.

  • Architektura uzlu řízená událostmi.

Architektura řízená událostmi není exkluzivní pro Node, např. Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (více jazyků).

  • Vícevláknové programování v jiných jazycích.

Všimněte si, že JavaScript záměrně nepodporuje více vláken. Ačkoli to podporuje webworkery, které, pokud vím, mohou fungovat jako vlákna.

Událostně řízená událost tedy není pro Node jedinečná a v Node lze provádět více vláken.

Zde tedy mohou být dvě otázky: „Jaký je rozdíl mezi událostmi řízenými a vícevláknovými procesy“ a „Jaký je rozdíl mezi uzly a jinými jazyky (frameworks)“. Zaměřím se na druhé, protože to se zdá být záměrem této otázky.

Řekl bych, že to, co dělá Node zvláštním, je, že jej autor vytvořil za účelem zamezení blokování IO při vytváření webových aplikací. Kultura komunity Node má zdůraznit a stavět na síle neblokující IO. Nenajdete příliš mnoho knihoven třetích stran, které provádějí blokování hovorů. Jako vývojář používající uzel je nepravděpodobné, že byste v kódu narazili na jemné blokační operace. Zatímco v jiných jazycích může naivní vývojář náhodně provádět vysoce neefektivní blokování hovorů, jako je čtení z připojení k databázi.

Kromě toho byste si měli opravdu přečíst několik modelů pro „souběžnost“ a pochopit jejich výhody a nevýhody. Bonusové body za to, že jsme ocenili, proč je víceprocesový proces tak dlouhou dobu přijatelný.



Odpověď 3:

Koncepční rozdíly lze snadno obtočit.

V architektuře založené na událostech se program spouští v nepřetržité smyčce s jedním vláknem (v uzlu můžete provést několik podprocesů, ale teď si nemusíte dělat starosti). Když událost nastane, na zásobníku volání je úloha, která bude řešena ve volném čase programů.

Vícevláknová architektura obvykle odesílá nové vlákno, když musí čekat na akci. Takže zavoláte do databáze a roztočíte nové vlákno, které provede všechny věci, které potřebujete, a provede to, co potřebujete, a uzavře nebo znovu připojí původní vlákno.

Obě tyto metody jsou velmi užitečné pro různé věci. Událost řízená událost je skvělá pro uživatelské rozhraní a servery, protože váš program neví, kdy nastane nová událost a často se události objeví v dávkách. Zatímco podproces je nezbytný pro výpočetně těžké úlohy, kde chcete rozdělit problém na mnohem menší kusy (nebo se blížíte limit jedné smyčky se závitem).