web-dev-qa-db-de.com

Multithreading in Node.js?

Ich implementiere socket.io in node.js für ein Windows Azure-Projekt. Ich muss in regelmäßigen Abständen Daten an alle angeschlossenen Clients senden.

Ich bin neu in node.js, aber ich denke, Multithreading ist nicht möglich. Der Zweck von socket.io ist die Unterstützung von Echtzeitanwendungen. Kann ich also in regelmäßigen Abständen kontinuierlich Daten an alle meine verbundenen Clients senden und gleichzeitig alle Daten verarbeiten, die die Clients an den socket.io-Server senden?

BEARBEITEN:

Dies ist ungefähr meine socket.io-Implementierung

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
}

Grundsätzlich möchte ich, dass die requestQueue-Methode kontinuierlich wie ein Thread ausgeführt wird, der in bestimmten Intervallen Daten an verbundene Clients sendet. Und auch wenn der Client irgendwelche Daten an das "clientData" -Ereignis sendet, sollte ich in der Lage sein, die Daten zu empfangen und zu verarbeiten.

Hast du eine Idee, wie ich das machen kann?

Vielen Dank

Meine Lösung:

 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

Wie von anderen vorgeschlagen, können Sie dies erreichen, indem Sie die Funktionen setInterval oder setTimeout verwenden, um regelmäßig Daten an verbundene Clients zu senden. Obwohl alles innerhalb des gleichen steuernden Threads läuft, werden alle E/A asynchron ausgeführt, sodass Ihre Anwendung immer noch ansprechbar ist. IE, alle Daten, die während des Timers empfangen werden, werden in eine Warteschlange gestellt und verarbeitet, nachdem die Timerfunktion zurückgekehrt ist.

Weitere Informationen finden Sie in Timers im Handbuch node.js.


Nebenbei bemerkt möchten Sie, dass Ihre Anwendung node.js sich auf die Verarbeitung asynchroner E/A in nahezu Echtzeit konzentriert, da dies die Stärke von node.js ist. Wenn Sie umfangreiche Berechnungen durchführen müssen, sollten Sie dies irgendwie in einen anderen Thread/Prozess verschieben, indem Sie einfach eine asynchrone Anforderung für das Ergebnis stellen.

11
Justin Ethier

Sie haben Recht, der Knoten ist ein einzelner Thread. Aber Ereignisse werden stark genutzt.

Die Strategie, die Sie anstreben sollten, besteht darin, Ereignisse auf den Verbindungen zu überwachen, Daten abzurufen, und wenn Sie Daten zurücksenden möchten, tun Sie dies, da ein anderes Ereignis ausgegeben wurde.

Wenn Sie sich die Beispiele auf der Startseite von socket.io ansehen, werden Sie sehen, wie diese Ereignisse verwenden, um die Verarbeitung der Streams zu starten. Mit der Methode on (eventName, function) überwachen Sie ein Ereignis in NodeJS.

Wenn Sie etwas tun möchten, das auf dem Timing basiert (im Allgemeinen eine schlechte Idee), werfen Sie einen Blick auf die Methode setInterval .

Server

    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);
      });
    });

Klient

    <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

Es gibt auch eine Node.js-Bibliothek für Threads: Node-Webworker-Threads

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

Dies implementiert im Wesentlichen die Web Worker Browser-API für node.js.

Beachten Sie, dass dies nicht mit der Philosophie von node.js des Einzelfadens übereinstimmt, aber es ist vorhanden, wenn Sie es brauchen.

3
Shawn Vincent

Multi-Threading in Node.js?

Ja ..es ist in nodejs mit dem npm-Modul 'Java4node' möglich, wenn dieses Paket eine Methode ist . MultiThreading (Aufgaben, Rückrufe) Diese Funktion wird zum Ausführen von Multithreading auf Java-Skript-Art verwendet

für die Verwendung dieses Moduls link: https://www.npmjs.com/package/Java4node

laufen loben

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

Die Logik, die Sie innerhalb von setInterval usw. definieren, funktioniert nicht in einem separaten Thread und blockiert schließlich den Main. Nehmen wir an, es gibt 1000 Benutzer, und Sie haben 1000 Mal setTimeout usw. aufgerufen. Irgendwann laufen sie und verbringen diese kostbare Zeit. Nur die letzten IO -Operationen blockieren nicht!

Sie sollten in Erwägung ziehen, nodeJX für Multithreading in node.js zu untersuchen

0
Nuray Altin