如何让setInterval在后台运行?

时间:2017-01-19 18:27:52

标签: node.js setinterval blocking

我有这个功能,它在我的节点服务器启动时在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);
  });
}

2 个答案:

答案 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分钟打电话一次......