web-dev-qa-db-fra.com

Multi threading dans Node.js?

J'implémente socket.io dans node.js pour un projet Windows Azure. Je dois envoyer des données à tous les clients connectés à intervalles réguliers.

Je suis nouveau sur node.js mais je suppose que le multi-threading n'est pas possible. Socket.io a pour but de prendre en charge les applications en temps réel. Y a-t-il moyen de pouvoir envoyer des données en continu à tous mes clients connectés et de traiter toutes les données que les clients envoient simultanément au serveur socket.io?

MODIFIER:

Ceci est à peu près ma mise en œuvre socket.io

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('first', "connected");

  socket.on('clientData', function (data) {
    //processing the data
  });
});

function requestQueue() {
// some processing
io.sockets.emit('broadcast', recordsQueue);
// should go to sleep for a time period
}

Je souhaite essentiellement que la méthode requestQueue s'exécute de manière continue comme un thread, qui émettra des données aux clients connectés à des intervalles particuliers. Et aussi si le client envoie des données à l'événement "clientData", je devrais être en mesure de recevoir les données et de les traiter.

Une idée sur comment je peux le faire?

Merci

Ma solution:

 var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.emit('first', "connected");

  socket.on('clientData', function (data) {
    //processing the data
  });
});

function requestQueue() {
var sleepTime = 0;

// calcuate sleepTime 

io.sockets.emit('broadcast', recordsQueue);

// should go to sleep for a time period
   if(sleepTime !=0)
   setTimeout(function () { requestQueue() }, sleepTime);
}
11
Bitsian

Comme d'autres l'ont suggéré, vous pouvez y parvenir en utilisant les fonctions setInterval ou setTimeout pour émettre périodiquement des données aux clients connectés. Bien que tout fonctionne dans le même thread de contrôle, toutes les E/S sont effectuées de manière asynchrone afin que votre application soit toujours réactive. En d'autres termes, toutes les données reçues pendant l'exécution du temporisateur seront mises en file d'attente et traitées après le retour de la fonction de temporisateur.

Voir Timers dans le manuel de node.js pour plus d'informations.


Par ailleurs, vous souhaiterez que votre application node.js se concentre sur le traitement des E/S asynchrones en temps quasi réel, ce qui fait toute la force de node.js. Si vous devez effectuer des calculs lourds, vous voudrez peut-être les décharger vers un autre processus/thread, en faisant simplement une demande asynchrone pour le résultat.

11
Justin Ethier

Vous avez raison, le noeud est un seul thread. Mais il fait un usage intensif des événements.

La stratégie à adopter est d'écouter les événements sur les connexions, de récupérer des données et, lorsque vous souhaitez renvoyer des données, vous le faites parce qu'un autre événement a été émis.

Si vous regardez les exemples de la page d'accueil de socket.io, vous verrez comment ils utilisent les événements pour commencer à traiter les flux. La méthode on (eventName, function) permet d'écouter un événement dans NodeJS.

Si vous souhaitez faire quelque chose en fonction du temps (généralement une mauvaise idée), jetez un coup d'œil à la méthode setInterval .

Serveur

    var io = require('socket.io').listen(80);

    io.sockets.on('connection', function (socket) {
      socket.emit('news', { hello: 'world' });
      socket.on('my other event', function (data) {
        console.log(data);
      });
    });

Client

    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('http://localhost');
      socket.on('news', function (data) {
        console.log(data);
        socket.emit('my other event', { my: 'data' });
      });
    </script>
11
ExxKA

Il existe également une bibliothèque Node.js pour faire des threads: node-webworker-threads

https://github.com/audreyt/node-webworker-threads

Ceci implémente fondamentalement l'API de navigateur Web Worker pour node.js.

Notez que cela n’est pas conforme à la philosophie de single-threaded de node.js, mais qu’il existe si vous en avez besoin.

3
Shawn Vincent

Multi threading dans Node.js?

Oui ..il est possible dans nodejs en utilisant le module npm 'Java4node', si cette méthode est . MultiThreading (tâches, callbacks) Cette fonction est utilisée pour effectuer du multithreading en script

pour utiliser ce module lien: https://www.npmjs.com/package/Java4node

courir recommander

npm install Java4node

var Java = require('Java4node')

Java.multiThreading({
           one: function(callback,parameters) {
               console.log("function one is running independently");
               callback()
           },
           two: function(callback,parameters) {
                console.log("function two is running independently");
               callback()
           },
           three: function(callback,parameters) {
                console.log("function three is running independently");
               callback()
           }
       }, function(err, results) {
           callback(err, results)
       });
0
ngCourse

La logique que vous définissez dans setInterval, etc. ne fonctionnera pas dans un thread séparé et finira par bloquer le principal. Supposons qu'il y a 1000 utilisateurs et que vous ayez appelé setTimeout, etc. 1000 fois, ils finiront par s'exécuter et dépenseront ce temps précieux. Seules les dernières opérations IO ne bloquent pas!

Vous pouvez envisager d’examiner nodeJX pour le multithreading dans node.js

0
Nuray Altin