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议的,您可以通过使用setInterval
或setTimeout
函数来定期向连接的客户端发送数据。 尽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) });
- 通过Visual Studio部署到Azure Cloud Service时,未设置环境variables
- 移动服务+ DocumentDB附件
- Microsoft Azure持续集成 – 使用Grunt“编译”步骤的NodeJs解决scheme
- azure色的移动服务错误找不到模块'azure-storage'
- 让wordpress在azure节点站点的子目录中运行
- 您无权查看Azure Ionic App的此目录或页面
- 在Node.js Web应用程序中使用用户名和密码在Azure AD上进行身份validation
- Bower未能在Azure上部署
- 如何在Visual Studio Online中将node.js应用程序部署到Azure?