2013-03-19 56 views
11

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

我是新来的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 
} 

基本上我想要的请求队列方法,不断就像一个线程,这会在特定的时间间隔发射数据连接的客户端运行。而且,如果客户端发送任何数据到“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); 
} 

回答

10

正如其他人的建议,你可以通过使用setIntervalsetTimeout功能定期发出的数据连接的客户端实现这一目标。虽然所有内容都在同一控制线程中运行,但所有I/O都是异步完成的,因此您的应用程序仍可以进行响应。 IE中,定时器运行时接收到的任何数据将在定时器函数返回后排队并处理。请参阅以了解更多信息。


在一个侧面说明,你会希望有您的Node.js应用程式专注于近实时的处理异步I/O,因为这是node.js中的力量如果您需要执行任何繁重的计算,那么您只需要简单地对结果进行异步请求即可将其卸载到另一个线程/进程中。

+0

谢谢大家的答案! setInterval已经解决了我的问题,但是,我的requestQueue方法做了一些繁重的计算,并且担心客户端发出的socket.io请求的性能会受到它的影响。如果你可以在你的附注中详细说明一下,或许可以使用代码片段或可能的链接,我会非常感激。非常感谢! – Bitsian 2013-03-21 07:32:46

+0

好吧,对于单线程应用程序或只有一个线程专用于特定任务的应用程序,这是一个反复出现的问题。例如,Windows前端应用程序只能有一个UI线程,所以必须非常小心,以确保将任何长时间运行的计算卸载到不同的线程/进程/等,以避免中断主GUI消息泵。节点有一个类似的约束,它只有一个执行线程,尽管可以有很多非阻塞I/O,因为这个工作独立于执行线程而发生。 – 2013-03-21 14:43:01

+0

下面是一个SO质疑有关长期运行在节点的计算,可以帮助:http://stackoverflow.com/questions/3809165/long-running-computations-in-node-js – 2013-03-21 14:45:02

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

客户

<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

我不知道,如果你有我的问题正确。我的错误,我没有正确的框架之前。我已经更新了该问题,请告诉我,如果您有任何想法? – Bitsian 2013-03-19 13:46:48

+0

你看过setInterval方法吗? – ExxKA 2013-03-19 15:04:10

+0

感谢您的setInterval :) Upvoting – Bitsian 2013-03-21 07:39:06

0

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

您可以考虑在多线程的Node.js调查nodeJX

0

在Node.js的多线程?

是..它能够在使用NPM模块“java4node”,它的NodeJS这种封装的方法是 .multiThreading(任务,回调) 该功能是使用用于执行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) 
     });