2013-03-19 10 views
11

Implementuję plik socket.io w pliku node.js dla projektu Windows Azure. Muszę wysyłać dane do wszystkich podłączonych klientów w regularnych odstępach czasu.Wielowątkowość w Node.js?

Jestem nowy w węźle node.js, ale myślę, że wielowątkowość nie jest możliwa. Zadaniem pliku socket.io jest obsługa aplikacji działających w czasie rzeczywistym, więc czy istnieje sposób, w jaki mogę wysyłać dane w sposób ciągły do ​​wszystkich moich klientów w regularnych odstępach czasu, a także przetwarzać dane, które klienci wysyłają jednocześnie do serwera socket.io?

EDIT:

To z grubsza moja realizacja 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 
} 

Zasadniczo chcę metoda requestQueue być uruchomiony w sposób ciągły jak nić, która będzie emitować danych do podłączonych klientów w poszczególnych przedziałach. A także, jeśli klient wysyła jakiekolwiek dane do zdarzenia "clientData", powinienem mieć możliwość odbierania danych i ich przetwarzania.

Masz pomysł, jak to zrobić?

Dzięki

Moje rozwiązanie:

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

Odpowiedz

10

Jak inni sugerują, można to osiągnąć za pomocą setInterval lub setTimeout funkcje okresowo emituje danych do połączonych klientów. Chociaż wszystko działa w tym samym wątku kontrolnym, wszystkie operacje we/wy są wykonywane asynchronicznie, więc aplikacja nadal będzie reagować. IE, wszystkie dane odebrane podczas działania zegara będą ustawiane w kolejce i przetwarzane po powrocie funkcji timera.

Przeczytaj instrukcję Timers w podręczniku node.js, aby uzyskać więcej informacji.


Na marginesie, będziesz chciał mieć swój node.js ostrość aplikacji na przetwarzanie asynchroniczne I/O w czasie zbliżonym do rzeczywistego, jak to jest siła node.js. Jeśli musisz wykonać jakieś ciężkie obliczenia, będziesz chciał odciążyć to na inny wątek/proces w jakiś sposób, po prostu wykonując żądanie asynchroniczne dla wyniku.

+0

Dziękuję wszystkim za odpowiedzi! setInterval rozwiązał mój problem, ale tak, moja metoda requestQueue wykonuje trochę ciężkich obliczeń i obawiam się, że wpłynie to na wydajność żądań socket.io, które robi klient. Byłbym bardzo wdzięczny, gdybyś mógł rozwinąć trochę na marginesie, może z fragmentem kodu lub linkiem, jeśli to możliwe. Wielkie dzięki! – Bitsian

+0

To jest powtarzający się problem dla aplikacji lub aplikacji jednowątkowych, które mają tylko jeden wątek poświęcony określonemu zadaniu. Na przykład, aplikacje frontonu Windows mogą mieć tylko jeden wątek interfejsu użytkownika, więc musisz być bardzo ostrożny, aby upewnić się, że jakiekolwiek długo działające obliczenia są wyładowywane do innego wątku/procesu/etc, aby uniknąć przerwania głównej pompy komunikatów GUI. Węzeł ma podobne ograniczenie, ponieważ ma tylko jeden wątek wykonania, chociaż może istnieć wiele nieblokujących operacji we/wy, ponieważ praca ta odbywa się niezależnie od wątku wykonywania. –

+0

Oto pytanie o długo działające obliczenia w węźle, które mogą pomóc: http://stackoverflow.com/questions/3809165/long-running-computations-in-node-js –

11

Masz rację, pojedynczy węzeł jest gwintowany. Ale powoduje intensywne korzystanie z wydarzeń.

Strategią, którą powinieneś szukać, jest słuchanie zdarzeń na połączeniach, pobieranie danych, a kiedy chcesz wysłać dane z powrotem, robisz to, ponieważ wydano inne wydarzenie.

Jeśli spojrzysz na przykłady na stronie głównej socket.io, zobaczysz, jak wykorzystują zdarzenia do rozpoczęcia przetwarzania strumieni. Metoda on (eventName, function) określa sposób wykrywania zdarzenia w NodeJS.

Jeśli chcesz zrobić coś w oparciu o czas (ogólnie zły pomysł), spójrz na metodę 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); 
     }); 
    }); 

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

Nie jestem pewien, czy prawidłowo podałeś moje pytanie. Mój błąd, że wcześniej nie zrobiłem tego prawidłowo. Mam zaktualizowane pytanie, proszę dać mi znać, jeśli masz jakiś pomysł? – Bitsian

+0

Czy spojrzałeś na metodę setInterval? – ExxKA

+0

Dzięki za setInterval :) Upvoting – Bitsian

0

Logika zdefiniowana wewnątrz setInterval itp.nie będzie działać w osobnym wątku i ostatecznie zablokuje główną. Załóżmy, że jest 1000 użytkowników i nazwałeś setTimeout itp. Na 1000 razy, w końcu będą działać i spędzić ten cenny czas. Tylko końcowe operacje wejścia/wyjścia nie są blokowane!

Można rozważyć dochodzenie nodeJX dla wielowątkowości w node.js

0

Wielowątkowość w Node.js?

Tak ..To jest możliwe w nodejs wykorzystaniem modułu npm „java4node”, to ten pakiet jest metoda .multiThreading (zadania, wywołania zwrotne) Ta funkcja jest wykorzystanie do przeprowadzenia wielowątkowość w java script sposób

dla za pomocą tego modułu link: https://www.npmjs.com/package/java4node

run pochwalić

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