13

我正在为 Windows Azure 项目在 node.js 中实现 socket.io。我必须定期向所有连接的客户端发送数据。

我是 node.js 的新手,但我想多线程是不可能的。socket.io 的目的是支持实时应用程序,那么有什么方法可以让我定期向所有连接的客户端连续发送数据,并同时处理客户端发送到 socket.io 服务器的任何数据?

编辑:

这大致是我的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);
}
4

5 回答 5

13

正如其他人所建议的那样,您可以通过使用setIntervalorsetTimeout函数定期向连接的客户端发送数据来实现此目的。尽管一切都在同一个控制线程中运行,但所有 I/O 都是异步完成的,因此您的应用程序仍然可以响应。IE,定时器运行时收到的任何数据都会在定时器函数返回后排队处理。

有关更多信息,请参阅node.js 手册中的计时器


附带说明一下,您需要让您的 node.js 应用程序专注于近乎实时地处理异步 I/O,因为这是 node.js 的优势所在。如果您需要进行任何繁重的计算,那么您将希望通过简单地对结果发出异步请求,以某种方式将其卸载到另一个线程/进程。

于 2013-03-20T17:29:29.237 回答
12

你是对的,节点是单线程的。但它大量使用了事件。

您应该采用的策略是侦听连接上的事件,检索数据,当您希望将数据发回时,您会这样做,因为已经发出另一个事件。

如果您查看 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);
      });
    });

客户

    <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>
于 2013-03-19T13:13:23.893 回答
3

还有一个用于处理线程的 Node.js 库:node-webworker-threads

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

这基本上实现了node.js的Web Worker 浏览器 API 。

请注意,这不符合 node.js 的单线程哲学,但如果您需要它,它就在那里。

于 2014-03-23T16:58:05.387 回答
1

Node.js 中的多线程?

是的..在nodejs中使用npm模块'java4node'是可能的,它这个包一个方法是.multiThreading(tasks,callbacks)这个函数用于以java脚本方式执行多线程

使用此模块链接:https ://www.npmjs.com/package/java4node

运行推荐

npm 安装 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)
       });
于 2017-09-18T03:17:32.963 回答
0

您在 setInterval 等中定义的逻辑不会在单独的线程中工作并最终阻塞主线程。假设有 1000 个用户,您调用 setTimeout 等 1000 次,最终他们将运行并花费宝贵的时间。只有最终的 IO 操作是非阻塞的!

您可以考虑在 node.js 中研究nodeJX的多线程

于 2014-01-10T08:42:26.007 回答