Многопоточность в Node.js?

Я реализую socket.io в node.js для проекта Windows Azure. Я должен отправлять данные всем подключенным клиентам через регулярные промежутки времени.

Я новичок в node.js, но думаю, многопоточность невозможна. Цель socket.io заключается в поддержке приложений реального времени, так же как я могу отправлять данные непрерывно всем подключенным клиентам через равные промежутки времени, а также обрабатывать любые данные, которые клиенты отправляют на сервер socket.io одновременно?

EDIT:

Это примерно моя реализация 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
}

По существу, я хочу, чтобы метод requestQueue работал непрерывно, как поток, который будет передавать данные подключенным клиентам с определенными интервалами. А также, если клиент отправляет какие-либо данные в событие "clientData", я должен иметь возможность получать данные и обрабатывать их.

Любая идея о том, как я могу это сделать?

Спасибо

Мое решение:

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

Ответ 1

Как и другие, вы можете достичь этого, используя функции setInterval или setTimeout, чтобы периодически передавать данные подключенным клиентам. Хотя все работает в одном и том же контрольном потоке, все операции ввода/вывода выполняются асинхронно, поэтому ваше приложение все равно будет реагировать. IE, любые данные, полученные во время работы таймера, будут помещены в очередь и обработаны после возврата функции таймера.

Подробнее см. Timers в руководстве node.js.


С другой стороны, вы захотите, чтобы ваше фокусное приложение node.js обрабатывало асинхронные операции ввода-вывода в режиме реального времени, так как это сила node.js. Если вам нужно выполнить какие-либо тяжелые вычисления, вам нужно как-то разгрузить это на другой поток/процесс, просто сделав асинхронный запрос для результата.

Ответ 2

Вы правы, node однопоточный. Но он активно использует события.

Стратегия, которую вы должны использовать, - это прослушивать события в соединениях, извлекать данные и когда вы хотите отправить данные обратно, потому что произошло другое событие.

Если вы посмотрите на примеры на главной странице socket.io, вы увидите, как они используют события для начала обработки потоков. Метод on (eventName, function) - это то, как вы слушаете событие в NodeJS.

Если вы хотите сделать что-то, основанное на сроках (как правило, плохая идея), взгляните на метод setInterval.

Сервер

    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>

Ответ 3

Существует также библиотека Node.js для выполнения потоков: node -webworker-threads

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

В основном это реализует API веб-браузера для Node.js.

Обратите внимание, что это не согласуется с философией Node.js одиночной резьбы, но она там, если вам это нужно.

Ответ 4

Логика, которую вы определяете внутри setInterval и т.д., не будет работать в отдельном потоке и в конечном итоге блокирует основной. Скажем, есть 1000 пользователей, и вы назвали setTimeout и т.д. 1000 раз, в конце концов они будут работать и тратить драгоценное время. Только конечные операции ввода-вывода не блокируются!

Вы можете рассмотреть возможность nodeJX для многопоточности в node.js

Ответ 5

Многопоточность в Node.js?

Да.. это возможно в nodejs, используя модуль npm 'java4node', этот пакет является методом .multiThreading(задачи, обратные вызовы)       Эта функция используется для выполнения многопоточности в режиме java script

для использования этого модуля ссылка: https://www.npmjs.com/package/java4node

запустите команду

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