我正在尝试使用node.js
实现长轮询策略我想要的是当向node.js发出请求时,它将等待最多30秒以使某些数据可用。如果有数据,它将输出并退出,如果没有数据,它将最多等待30秒,然后退出。
这是我提出的基本代码逻辑 -
var http = require('http');
var poll_function = function(req,res,counter)
{
if(counter > 30)
{
res.writeHeader(200,{'Content-Type':'text/html;charset=utf8'});
res.end('Output after 5 seconds!');
}
else
{
var rand = Math.random();
if(rand > 0.85)
{
res.writeHeader(200,{'Content-Type':'text/html;charset=utf8'});
res.end('Output done because rand: ' + rand + '! in counter: ' + counter);
}
}
setTimeout
(
function()
{
poll_function.apply(this,[req,res,counter+1]);
},
1000
);
};
http.createServer
(
function(req,res)
{
poll_function(req,res,1);
}
).listen(8088);
我的意思是,当发出请求时,调用poll_function,它在1秒后通过自身内的setTimeout调用自身。因此,它应该保持异步意味着,它不会阻止其他请求,并在完成后提供输出。
我在这里使用Math.random()逻辑以不同的间隔模拟数据可用性场景。
现在,我关心的是 -
1)它会有任何问题吗? - 我只是不想部署它,而不确定它不会反击!
2)效率高吗?如果没有,任何建议如何改进它?
谢谢,
安键
答案 0 :(得分:0)
所有nodejs代码都是非阻塞的,只要你没有在紧密的CPU循环(如while(true))中使用hunk或使用具有阻塞I / O的库。将setTimeout放在函数末尾不会使它更加平行,它只是将一些cpu工作推迟到以后的事件。
这是一个简单的演示聊天服务器,每0至60秒随机向所有连接客户端发送“Hello World”。
// A simple chat server using long-poll and timeout
var Http = require('http');
// Array of open callbacks listening for a result
var listeners = [];
Http.createServer(function (req, res) {
function onData(data) {
res.end(data);
}
listeners.push(onData);
// Set a timeout of 30 seconds
var timeout = setTimeout(function () {
// Remove our callback from the listeners array
listeners.splice(listeners.indexOf(onData), 1);
res.end("Timeout!");
}, 30000);
}).listen(8080);
console.log("Server listening on 8080");
function emitEvent(data) {
for (var i = 0; l = listeners.length; i < l; i++) {
listeners[i](data);
}
listeners.length = 0;
}
// Simulate random events
function randomEvents() {
emitData("Hello World");
setTimeout(RandomEvents, Math.random() * 60000);
}
setTimeout(RandomEvents, Math.random() * 60000);
这将非常快。唯一危险的部分是拼接。如果阵列变得非常大,拼接可能会很慢。这可以通过在最后一次事件之后每30秒或30秒开始关闭所有处理程序30秒的时间来关闭连接,而不是关闭连接。但同样,这不太可能成为瓶颈,因为每个数组项都有可能更昂贵的真实客户端连接支持。