2013-03-19 14 views
11

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.Multi Threading in Node.js?

Ich bin neu bei node.js, aber ich denke, Multi-Threading ist nicht möglich. Der Zweck von socket.io ist die Unterstützung von Echtzeit-Anwendungen, gibt es also eine Möglichkeit, Daten kontinuierlich an alle meine verbundenen Clients in regelmäßigen Abständen zu senden und auch alle Daten zu verarbeiten, die die Clients gleichzeitig an den Server socket.io senden?

EDIT:

Dies ist in etwa 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 
} 

Im Grunde möchte ich werden die Request Verfahren kontinuierlich wie ein roter Faden läuft, die Daten an die angeschlossenen Clients in bestimmten Intervallen emittieren. Und auch wenn der Client irgendwelche Daten an das Ereignis "clientData" sendet, sollte ich in der Lage sein, die Daten zu empfangen und zu verarbeiten.

Irgendeine Idee, wie ich es tun kann?

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

Antwort

10

Wie andere vorgeschlagen haben, können Sie dies erreichen, indem die setInterval oder setTimeout Funktionen in regelmäßigen Abständen Daten an die angeschlossenen Clients zu emittieren. Obwohl alles im selben Steuerungs-Thread ausgeführt wird, erfolgt die gesamte E/A-Verarbeitung asynchron, sodass Ihre Anwendung weiterhin reagiert. IE, alle Daten, die empfangen werden, während der Timer läuft, werden in die Warteschlange gestellt und verarbeitet, nachdem die Timerfunktion zurückkehrt.

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


Auf einer Seite beachten, werden Sie Ihre node.js Anwendung den Fokus auf die Verarbeitung asynchroner I/O in nahezu in Echtzeit haben, als dass die Stärke der node.js. ist Wenn Sie umfangreiche Berechnungen durchführen müssen, sollten Sie diese in einen anderen Thread/Prozess verschieben, indem Sie einfach eine asynchrone Anfrage für das Ergebnis erstellen.

+0

Vielen Dank für die Antworten! setInterval hat mein Problem gelöst, aber ja, meine requestQueue-Methode macht ein paar schwere Berechnungen und bin besorgt, dass die Leistung von socket.io-Anfragen, die der Client macht, davon betroffen sein wird. Ich würde es sehr schätzen, wenn Sie ein wenig auf Ihrer Randnotiz arbeiten könnten, vielleicht mit einem Code-Snippet oder einem Link, wenn möglich. Danke vielmals! – Bitsian

+0

Nun, dies ist ein wiederkehrendes Problem für Single-Thread-Anwendungen oder Anwendungen, die nur einen einzigen Thread für eine bestimmte Aufgabe gewidmet haben. Beispielsweise können Windows-Front-End-Anwendungen nur einen einzigen UI-Thread haben. Daher müssen Sie sehr sorgfältig darauf achten, dass lange laufende Berechnungen in einen anderen Thread/Prozess/etc ausgelagert werden, um die Haupt-GUI-Nachrichtenpumpe nicht zu unterbrechen. Der Knoten hat eine ähnliche Einschränkung, da er nur einen einzigen Ausführungs-Thread hat, obwohl es viele nicht-blockierende E/A geben kann, da diese Arbeit unabhängig vom Ausführungs-Thread erfolgt. –

+0

Hier ist eine SO Frage über lang laufende Berechnungen in Knoten, die helfen können: http://StackOverflow.com/Questions/3809165/Long-Running-Computations-in-Node-Js –

11

Du hast recht, ist der Knoten Gewinde Single. Aber es macht Gebrauch von Ereignissen.

Die Strategie, die Sie gehen sollten, ist auf Ereignisse auf den Verbindungen zu hören, Daten abzurufen, und wenn Sie Daten zurück senden möchten, tun Sie es, weil ein anderes Ereignis ausgegeben wurde.

Wenn Sie sich die Beispiele auf der Startseite von socket.io ansehen, sehen Sie, wie sie Ereignisse verwenden, um mit der Verarbeitung der Streams zu beginnen. Die Methode on (eventName, function) ist die Art und Weise, wie Sie in NodeJS auf ein Ereignis warten.

Wenn Sie etwas basierend auf Timing (in der Regel eine schlechte Idee) tun möchten, werfen Sie einen Blick auf die setInterval Methode.

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

Kunde

<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> 
+0

Ich bin nicht sicher, ob Sie meine Frage richtig bekommen haben. Mein Fehler, dass ich es vorher nicht richtig gestaltet habe. Ich habe die Frage aktualisiert, bitte lassen Sie mich wissen, wenn Sie eine Idee haben? – Bitsian

+0

Haben Sie sich die setInterval-Methode angesehen? – ExxKA

+0

Vielen Dank für das setInterval :) Upvoting – Bitsian

0

Die Logik, die Sie innerhalb des setInterval usw. definierenwird nicht in einem separaten Thread arbeiten und den Hauptblock blockieren. Nehmen wir an, es gibt 1000 Benutzer und Sie haben das setTimeout usw. 1000 mal aufgerufen, irgendwann werden sie laufen und diese kostbare Zeit verbringen. Nur die letzten IO-Operationen sind nicht blockierend!

Sie können prüfen, nodeJX für Multithreading in node.js

0

Multi Threading in Node.js?

Ja ..es ist möglich in NodeJS mit npm Modul ‚java4node‘, es dieses Paket ist ein Verfahren .multiThreading (Aufgaben, Rückrufe) Diese Funktion ist für den Einsatz in ausführen Weise Skript Java Multithreading

für mit diesem Modul Link: https://www.npmjs.com/package/java4node

Lauf lobe

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