Node.js中的多线程?

Bit*_*ian 11 javascript multithreading azure node.js socket.io

我正在node.js中为Windows Azure项目实现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
}
Run Code Online (Sandbox Code Playgroud)

本质上,我希望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);
}
Run Code Online (Sandbox Code Playgroud)

小智 11

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

您应该采取的策略是监听连接上的事件,检索数据,以及当您希望发回数据时,您可以执行此操作,因为已发出其他事件.

如果您查看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);
      });
    });
Run Code Online (Sandbox Code Playgroud)

客户

    <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>
Run Code Online (Sandbox Code Playgroud)


Jus*_*ier 11

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

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


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

  • 这是一般方法.只是想补充说,如果你真的需要线程,你可以使用Worker类,并且为了负载平衡,你可以使用多个节点进程和代理端口.http://nodejs.org/api/cluster.html#cluster_cluster (2认同)