我有这个功能,它在我的节点服务器启动时在index.js文件中调用。在init函数中,它将setInterval
设置为定期调用refreshKeyValues
,大约需要10秒。
我运行了一些测试并发送了一个健康检查(简单的调用健康终点返回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);
});
}
答案 0 :(得分:0)
JavaScript的setInterval
函数是异步的,因此当它处于“等待”状态时它不会阻塞主流。但是你的函数refreshKeyValues
似乎不是异步的,所以它可能会阻止主要的JavaScript流程。当它调用时,refreshKeyValues
可以阻止流,因为JavaScript是单线程的。
阅读本文时,您可以更好地理解:JavaScript event loop
答案 1 :(得分:0)
Ivan Matveev是完全正确的。 Node.js是单线程的,即使它看起来不像是由于它的异步性质。但是,您可以使用cluster
模块实现所需的功能。以下是如何做到这一点:
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);
}
});
}
编辑:
另外,如果运行需要10秒,为什么每秒运行一次refreshKeyValues
函数?我建议你每10分钟打电话一次......