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