Quina diferència hi ha entre l’arquitectura basada en esdeveniments de Node.js i la programació multi-threaded en altres idiomes?


Resposta 1:

Tant en el paradigma basat en esdeveniments com en el multi-threaded, el codi s'executa dins d'un procés del sistema operatiu.

Quan el procés executa diversos fils, aquests fils comparteixen la memòria del procés (espai d’adreces) tant per a la lectura com per a l’escriptura.

JavaScript que fa servir Node.js està dissenyat per un filet. Es garanteix que totes les funcions s’executin fins a la seva finalització i no s’executarà cap altre codi JavaScript en el procés actual durant l’execució de la funció. Els esdeveniments naturalment asíncrons (xarxa, entrada-sortida de disc, temporitzadors, altres esdeveniments del maquinari i del sistema operatiu) són gestionats pel motor que afegeix les funcions de JavaScript registrades com a gestors (o de trucades) per a aquests esdeveniments a la cua del bucle d'esdeveniments que s'executarà després s’han acabat les funcions davant de la cua.

En el paradigma de diversos fils, dos o més fils corren codi en paral·lel, de manera que durant una execució d'una funció es pot executar un fragment de codi diferent també en un nucli de processador diferent, possiblement llegint o escrivint a les mateixes adreces de memòria. Això pot provocar un estat inconsistent de la memòria a menys que el codi utilitzi mecanismes especials del sistema operatiu (primitives de sincronització) per gestionar l'accés a la memòria compartida.



Resposta 2:

Aquesta és una bona pregunta: "Quina diferència hi ha entre l'arquitectura basada en esdeveniments i la programació multi-threaded de Node.js en altres idiomes?".

Podem i hem de descompondre’ns una mica.

  • Arquitectura basada en esdeveniments del node.

L’arquitectura dirigida per esdeveniments no és exclusiva de Node, per exemple, Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (diversos idiomes).

  • Programació multi-threaded en altres idiomes.

Tingueu en compte que JavaScript, per disseny, no és compatible amb diversos fils. Tot i que admet treballadors web, que, pel que sé, pot funcionar com a fils.

De manera que el fet basat en esdeveniments no és exclusiu del node, es pot fer multi-threading al node.

Per tant, hi pot haver dues preguntes aquí: "Quina diferència hi ha entre esdeveniments i multi-threading" i "Quina diferència hi ha entre nodes i altres idiomes (marcs de treball)". Em centraré en aquest últim, ja que sembla que sigui la intenció de la pregunta.

Jo diria que el que fa que Node sigui especial és que l’autor el va crear amb l’objectiu d’evitar bloquejar IO quan construeixi aplicacions web. La cultura de la comunitat de nodes és fer èmfasi en la força de la OO que no bloqueja. No trobareu gaires biblioteques de tercers que facin bloquejar trucades. Com a desenvolupador que utilitza Node, és poc probable que realitzeu operacions de bloqueig subtil al vostre codi. Mentre que en altres idiomes, un desenvolupador ingenu podria fer trucades de bloqueig altament ineficients com ara llegir una connexió de base de dades.

A part d’això, hauríeu de llegir realment diversos models de “concurrència” i comprendre els avantatges i els contres de cadascun. Punts de bonificació per apreciar perquè el multi-threading era acceptable durant tant de temps.



Resposta 3:

les diferències conceptuals són força fàcils d’embolicar el cap.

En arquitectura basada en esdeveniments, el programa s'executa en un bucle roscat continu (podeu fer una roscada multiplicada en un node, però ara no us preocupeu). Quan es dispara un esdeveniment, un treball està a la pila de trucades per ser tractat als programes de lleure.

L’arquitectura de diversos fils generalment envia un fil nou quan ha d’esperar una acció. Per tant, realitzeu una trucada a una base de dades i creeu un fil nou que porti a terme totes les coses que necessiteu i feu allò que necessiteu i acabi o torni a unir el fil original.

Ambdós mètodes són molt útils per a diferents coses. L'esdeveniment dirigit a esdeveniments és excel·lent per a la interfície d'usuari i els servidors, ja que el programa no sap quan passarà una nova i, sovint, els esdeveniments esclataran. Mentre que la rosca és necessària per a treballs pesats computacionalment on vulgueu desglossar un problema en peces molt més petites (o us acosteu al límit del vostre bucle roscat).