Node.js 如何使setInterval在后台运行?

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

我有这个函数,它是在我的节点服务器启动时在index.js文件中调用的。在init函数中,它将
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秒。