Node.js 如何使setInterval在后台运行?
我有这个函数,它是在我的节点服务器启动时在index.js文件中调用的。在init函数中,它将Node.js 如何使setInterval在后台运行?,node.js,setinterval,blocking,Node.js,Setinterval,Blocking,我有这个函数,它是在我的节点服务器启动时在index.js文件中调用的。在init函数中,它将setInterval设置为定期调用refreshKeyValues,这大约需要10秒。 我运行了一些测试并发送了一个运行状况检查(对运行状况端点的简单get调用返回200 ok),当运行refreshKeyValues时,运行状况检查似乎被阻止。 setInterval是否阻塞?我如何使这个刷新逻辑在后台运行,以便它不会阻止传入的请求 export default function initMyCli
setInterval
设置为定期调用refreshKeyValues
,这大约需要10秒。
我运行了一些测试并发送了一个运行状况检查(对运行状况端点的简单get调用返回200 ok),当运行refreshKeyValues
时,运行状况检查似乎被阻止。
setInterval
是否阻塞?我如何使这个刷新逻辑在后台运行,以便它不会阻止传入的请求
export default function initMyClient(server) {
server.clients.myclient = MyClient.createNewClient();
server.clients.myclient.init();
server.keyValues = getKeyValues();
function refreshKeyValues() {
server.keyValues = getKeyValues();
}
const refreshInterval = setInterval(
refreshKeyValues,
1000
);
server.on('close', function onClose() {
clearInterval(refreshInterval);
});
}
JavaScript的
setInterval
函数是异步的,因此当它处于“等待”状态时不会阻塞主流。但是您的函数refreshKeyValues
似乎不是异步的,因此它可能会阻止主JavaScript流。调用时,refreshKeyValues
会阻止流,因为JavaScript是单线程的。
通过阅读,您可以更好地理解:伊万·马特维夫完全正确。Node.js是单线程的,尽管它看起来可能不是因为它的异步性质。但是,您可以使用
集群
模块实现所需功能。以下是如何做到这一点:
var cluster = require('cluster');
if (cluster.isMaster) {
var httpWorker = cluster.fork(); // worker thread for server
var intervalWorker = cluster.fork(); // worker thread for setInterval
// send messages to your wokers specifying the worker type
httpWorker.send({ server: true });
intervalWorker.send({ server: false });
} else {
process.on('message', function (data) {
if (data.server) {
// start server
var server = require('http').createServer(function (req, res) {
res.end('OK');
});
server.listen(8080, function () {
console.log('server running');
});
} else {
// start your interval
setInterval(function () {
console.log('1s passed');
}, 1000);
}
});
}
编辑:
另外,如果运行refreshKeyValues
函数需要10秒,为什么还要每秒运行一次呢?我建议你每10秒打一次电话 如何实现getKeyValues()
?很少有CPU密集型任务需要很长时间。此外,您在上述代码中的周期是1秒,而不是10秒。