web-dev-qa-db-fra.com

Saisir le Node JS alternative au multithreading

Si je comprends bien Node JS n'est pas bloquant ... donc au lieu d'attendre une réponse d'une base de données ou d'un autre processus, il est passé à autre chose et revient plus tard.

En outre, il est simple thread.

Cela signifie-t-il qu'un processus JS donné Node) peut utiliser pleinement et efficacement un seul cœur de processeur, mais il n’utilisera aucun autre cœur sur la machine, car il n’en utilisera jamais plus de un à la fois.

Bien entendu, cela signifie que les autres processeurs peuvent toujours être utilisés par d'autres processus pour des tâches telles que la base de données SQL ou d'autres sous-routines lourdes de processeurs séparées intentionnellement, à condition qu'il s'agisse d'un processus séparé.

De plus, dans le cas où le processus JS Node) comporte une boucle infinie ou une longue fonction, ce processus n’est plus utile jusqu’à ce que la boucle infinie ou la longue fonction soit arrêtée (ou tout le processus tué).

Est-ce que tout ça va bien? Suis-je correct dans ma compréhension?

139
Bryan Field

Assez correct, oui. Le serveur node.js dispose d’un pool de threads interne, ce qui lui permet d’effectuer des opérations de blocage et de notifier le thread principal par un rappel ou un événement lorsque la tâche est terminée.

Donc, j'imagine que l'utilisation d'un autre noyau pour le pool de threads sera limitée. Par exemple, si vous lisez un système de fichiers non bloquant, cela est probablement implémenté en demandant à un thread du pool de thread d'effectuer une lecture et de définir un rappel lorsque c'est fait, ce qui signifie que la lecture peut avoir lieu sur un autre thread/core alors que le programme node.js principal fait autre chose.

Mais du point de vue de node.js, il est entièrement à thread unique et n’utilisera pas directement plus d’un cœur.

86
jcoder

Oui, je dirais que votre compréhension est tout à fait correcte. Cet article ( archivé ) explique très bien la raison d'être de ce modèle. C'est probablement le paragraphe le plus important:

Apache est multithread: il crée un thread par requête (ou processus, cela dépend de la conf). Vous pouvez voir comment cette surcharge consomme de la mémoire à mesure que le nombre de connexions simultanées augmente et que davantage de threads sont nécessaires pour desservir plusieurs clients simultanés. Nginx et Node.js ne sont pas multithreads, car les threads et les processus entraînent des coûts de mémoire élevés. Ils sont mono-threadés, mais basés sur des événements. Cela élimine la surcharge créée par des milliers de threads/processus en gérant plusieurs connexions dans un seul thread.

36

Même si c’est un vieux fil, je pensais que je partagerais avec une idée la façon d’utiliser plus d’un noyau dans l’application Node.JS. Comme Nuray Altin l’a mentionné - JXcore peut le faire.

Exemple simple:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

Par défaut, il y a deux threads (vous pouvez le changer avec jxcore.tasks.setThreadCount() )

Bien sûr, vous pouvez faire beaucoup plus avec les tâches. Les documents sont ici .

Quelques articles sur ce sujet:

26
infografnet

Depuis cette question posée il y a presque 2 ans. Les choses deviennent différentes ou il existe des approches alternatives au problème de multithreading sur Node.JS

Selon l'article de blog ci-dessous, en utilisant l'extension "tâche" entrante, certains utilisateurs peuvent directement bénéficier d'autres cœurs disponibles.

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

13
Nuray Altin

Node.js est une application à un seul thread, mais elle peut prendre en charge la simultanéité via le concept d'événement et de rappel. Voici une vidéo de Philip Roberts qui explique le fonctionnement des boucles d’événements en javascript.

Cliquez ici pour voir la vidéo

(Au lieu de WebAPI, il y a des API C++ dans Node.js)

1
Saurabh Lende