65 votes

NodeJS est-il vraiment monofilaire ?

Node.js résout le "problème d'un thread par connexion" en plaçant le modèle événementiel à son cœur, en utilisant une boucle d'événements au lieu de threads. Toutes les opérations d'E/S coûteuses sont toujours exécutées de manière asynchrone avec un callback qui est exécuté lorsque l'opération initiée est terminée.

L'observation SI une opération se produit est gérée par des mécanismes de multiplexage tels que epoll() .

Ma question est maintenant :

  • Pourquoi NodeJS ne bloque-t-il pas lors de l'utilisation des Systemcalls bloquants select/epoll/kqueue ?

  • Ou bien NodeJS n'est pas du tout monofilaire, de sorte qu'un deuxième fil est
    nécessaire d'observer toutes les opérations d'E/S avec select/epoll/kqueue ?

6 votes

Je vous suggère de lire cet excellent article intitulé "Node is Not Single Threaded" : rickgaribay.net/archive/2012/01/28/

0 votes

Vous ne pouvez pas faire des tâches/traitements parallèles dans NodeJS.

0 votes

Vous exécutez rarement une seule instance de Node dans votre déploiement, vous aurez donc plusieurs threads. Si vous utilisez quelque chose comme Sails.js (framework MVC pour Node), vous devez vous assurer que les actions de votre contrôleur sont atomiques, sinon les opérations seront mélangées et le résultat sera inattendu.

122voto

Femi Points 42054

NodeJS est Événement (2ème ligne à partir de la site web ), et non pas monofilaire. Il gère en interne le threading nécessaire à la gestion des select/epoll/kqueue sans que l'utilisateur n'ait à le gérer explicitement, mais cela ne signifie pas qu'il n'y a pas d'utilisation de threads en son sein.

154 votes

Et l'environnement JavaScript s'exécute dans un seul thread. Tous les autres threads sont gérés par un pool de threads au niveau C.

1 votes

J'aimerais pouvoir t'upvoter aussi, Raynos. (Edit : well I can, sort of)

0 votes

Mais comment expliquer que le nœud n'utilise qu'un seul cœur alors ?

11voto

serkan Points 2807

Non.

Lorsque les opérations d'E/S sont initiées, elles sont déléguées à libuv libuv annonce la fin des opérations d'E/S, ce qui permet à tous les callbacks qui attendent cet événement d'être réintroduits dans le thread principal de V8 pour être exécutés.

V8 -> E/S déléguées ( libuv ) -> Pool de threads -> Asynchrone multi-filière

1voto

Pujan Srivastava Points 964

JavaScript est monofilaire, tout comme le modèle d'événement. Mais la pile Node n'est pas monofilaire.

Node utilise le moteur V8 pour la concurrence.

0voto

yaswanthkoneri Points 140

Non Nodejs dans son ensemble n'est pas single-threaded, mais la boucle Node-Event (que nodeJS utilise fortement) est single-threaded.

Certains éléments de la structure de nœuds/Std Lib ne sont pas monofilaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X