Care este diferența dintre arhitectura Node.js bazată pe evenimente și programarea cu mai multe fire în alte limbi?


Răspunsul 1:

Atât în ​​paradigma bazată pe evenimente, cât și în mai multe fire, codul rulează în cadrul unui proces de sistem de operare.

Când procesul rulează mai multe fire, aceste fire împărtășesc memoria procesului (spațiul de adrese) atât pentru citire cât și pentru scriere.

JavaScript care alimentează Node.js este conceput cu o singură fire. Fiecare funcție este garantată să ruleze până la finalizare și niciun alt cod JavaScript în procesul curent nu va rula în timpul rulării respectivei funcții. Evenimentele natural asincrone (rețea, intrare-ieșire pe disc, cronometre, alte evenimente hardware și sistem de operare) sunt gestionate de motor care adaugă funcțiile JavaScript înregistrate ca gestionari (sau apeluri) pentru aceste evenimente la coada de bucle de eveniment care urmează să fie executată după funcțiile din fața cozii s-au terminat.

În paradigma cu mai multe filete, două sau mai multe fire rulează codul în paralel, astfel încât în ​​timpul unei funcții rulate, o bucată de cod diferită poate rula și pe un nucleu de procesor diferit, eventual citind sau scriind la aceleași adrese de memorie. Acest lucru poate duce la o stare inconsistentă a memoriei, cu excepția cazului în care codul utilizează mecanisme speciale de sistem (primitive de sincronizare) pentru a gestiona accesul la memoria comună.



Răspunsul 2:

Aceasta este o întrebare bună, „Care este diferența dintre arhitectura Node.js bazată pe evenimente și programarea cu mai multe fire în alte limbi?”.

Putem și ar trebui să ne descompunem puțin.

  • Arhitectura nodului bazată pe evenimente.

Arhitectura condusă de evenimente nu este exclusivă pentru Node, de exemplu, Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (mai multe limbi).

  • Programare cu mai multe fire în alte limbi.

Rețineți că JavaScript, prin design, nu acceptă mai multe fire. Deși acceptă webworkers, care, din câte știu eu, pot funcționa ca fire.

Așadar, dirijat de evenimente nu este unic Nodului și multi-filetarea se poate face în Node.

Așadar, aici pot fi două întrebări: „Care este diferența între evenimente și multi-threading” și „Care este diferența dintre nod și alte limbi (cadre)”. Mă voi concentra pe aceasta din urmă, deoarece aceasta pare a fi intenția întrebării.

Aș spune că ceea ce face ca Node să fie special este faptul că autorul l-a creat pentru a evita blocarea IO la construirea aplicațiilor web. Cultura comunității nodului este să sublinieze și să se bazeze pe puterea IO care nu blochează. Nu veți găsi prea multe biblioteci terțe care efectuează apeluri de blocare. Ca dezvoltator care utilizează Node, este puțin probabil să efectuați operațiuni de blocare subtile din codul dvs. În timp ce în alte limbi, un dezvoltator naiv ar putea efectua accidental apeluri de blocare extrem de ineficiente, cum ar fi citirea dintr-o conexiune la baza de date.

În afară de asta, ar trebui să citiți cu adevărat despre mai multe modele pentru „concurgență” și să înțelegeți avantajele și dezavantajele fiecăruia. Puncte bonus pentru aprecierea motivului pentru care multi-filetarea a fost acceptabilă atât de mult timp.



Răspunsul 3:

diferențele conceptuale sunt destul de ușor de înfășurat capul.

În arhitectura bazată pe evenimente, programul dvs. rulează într-o buclă continuă cu filetare continuă (puteți efectua câteva filetări multiple în nod, dar nu vă faceți griji în acest moment). Când un eveniment se declanșează, un loc de muncă este pus pe stiva de apeluri pentru a fi ocupat în timpul liber al programelor.

Arhitectura cu mai multe filete expediază, în general, un nou thread atunci când trebuie să aștepte o acțiune. Așadar, efectuați un apel către o bază de date și creați un nou thread care va duce la îndeplinire toate lucrurile de care aveți nevoie și face ceea ce aveți nevoie pentru a încheia sau reintra în firul inițial.

Ambele metode sunt foarte utile pentru diferite lucruri. Organizat de evenimente este excelent pentru interfața utilizatorului și serverele, deoarece programul dvs. nu știe când se va întâmpla o nouă și de multe ori evenimentele vor veni în explozii. În timp ce filetarea este necesară pentru lucrări grele din punct de vedere al calculului, unde doriți să spargeți o problemă în bucăți mult mai mici (sau vă apropiați de limita buclei tale unice).