Node.js中的multithreading?

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

我是node.js的新手,但我想multithreading是不可能的。 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”事件,那么我应该能够接收数据并对其进行处理。

任何想法,我怎么能做到这一点?

谢谢

我的解决scheme

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

正如其他人所build议的,您可以通过使用setIntervalsetTimeout函数来定期向连接的客户端发送数据。 尽pipe所有的I / O都在同一个控制线程中运行,但是所有的I / O都是asynchronous完成的,所以你的应用程序仍然可以响应。 IE,在定时器运行时收到的任何数据将在定时器函数返回后排队并处理。

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


在附注中,您将希望让node.js应用程序专注于近乎实时地处理asynchronousI / O,因为这是node.js的优势。 如果你需要做任何繁重的计算,那么你只需要简单地对结果进行一个asynchronous请求就可以把它转移到另一个线程/进程。

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

你应该去做的策略是监听连接上的事件,检索数据,当你想发送数据时,你可以这样做,因为发生了另一个事件。

如果您看一下socket.io首页上的示例,您将看到他们如何使用事件来开始处理stream。 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> 

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

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

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

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

你在setInterval里面定义的逻辑将不会在单独的线程中工作,并最终阻塞main。 比方说,有1000个用户,你叫setTimeout等1000次,最终他们将运行和花费那么宝贵的时间。 只有最后的IO操作是无阻塞的!

您可以考虑在node.js中调查nodeJX进行multithreading

Node.js中的multithreading?

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

使用这个模块链接: 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) });