我正在尝试使用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)效率高吗?如果没有,我有什么建议吗?
谢谢,
安然
最佳答案
只要您不会在紧密的CPU循环中结块(例如while(true))或使用具有阻塞I / O的库,所有nodejs代码都是非阻塞的。将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秒一次关闭所有处理程序,而不是关闭30秒,可以使效率更高。但是同样,这不太可能成为瓶颈,因为这些数组项中的每一个都由可能更昂贵的真实客户端连接支持。
关于node.js - Node.js长轮询逻辑帮助!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6094071/