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
正如其他人所建议的那样,您可以通过使用setInterval
或setTimeout
函数定期向连接的客户端发送数据来实现此目的.虽然一切都在同一个控制线程中运行,但所有I/O都是异步完成的,因此您的应用程序仍然会响应.IE,计时器运行时收到的任何数据将在计时器功能返回后排队并处理.
有关更多信息,请参阅node.js手册中的Timers.
另外,您需要让node.js应用程序专注于近乎实时地处理异步I/O,因为这是node.js的强度.如果您需要进行任何繁重的计算,那么您将希望通过简单地对结果进行异步请求,以某种方式将其卸载到另一个线程/进程.
归档时间: |
|
查看次数: |
37338 次 |
最近记录: |