gpt4 book ai didi

Node.js 长轮询逻辑有帮助!

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:38 32 4
gpt4 key购买 nike

我正在尝试使用 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 秒后关闭连接,可以提高效率。但同样,这不太可能成为瓶颈,因为每个数组项都由可能更昂贵的真实客户端连接支持。

关于Node.js 长轮询逻辑有帮助!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6094071/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com