NodeJs setInterval不延长进程生命周期

时间:2017-04-06 12:10:07

标签: javascript node.js asynchronous settimeout setinterval

我简化它以更好地理解我需要的东西:我要做的任务是,我们有一个很长的未知nodejs进程(有很多排队的异步函数,我们永远不知道它们何时完成或类似的东西)我们希望有一个更新过程,我们将当前进程状态存储在数据库中。为此我们有一个启动(它存储“开始”)和一个位于process.on('beforeExit', function () { ... });之上的结束进程。现在我们必须处理客户要求的“仍在运行”过程。为此,我们希望每隔十分钟更新状态以使用时间戳运行(此功能已存在且称为state.setRunningState()

现在我遇到了问题,我怎么能每十分钟触发一次这个功能。为此,我采用的方法触发了此功能的工作过程的每个事件,并比较它是否比10分钟前更早。问题是:有时候没有任何事件会有更多的时间。所以第二个选项是setInterval(),这就是我的问题:如果我使用setInterval,我的nodejs进程将永远不会到达终点,因此进程将一直运行直到Interval被清除。但我也不知道何时应该致电clearInterval()

所以问题是:有没有办法在不延长nodejs进程的生命周期的情况下创建这样的超时。如果一切都完成了,它应该结束并忽略间隔的其余部分。

2 个答案:

答案 0 :(得分:7)

与此处的一些评论相反,这并不是一个奇怪的要求,即在流程运行时定期执行某些操作而不会使流程无限运行,这会使其毫无意义。

有一个内置的机制。如果您不希望间隔(或超时)停止退出流程,则需要使用.unref()方法。

而不是:

setInterval(() => {
  console.log('Interval');
}, 1000);

使用:

setInterval(() => {
  console.log('Interval');
}, 1000).unref();

如果没有其他待处理事件,您的间隔将不会停止退出流程。

尝试运行此示例:

setInterval(() => {
  console.log('Interval');
}, 1000).unref();

setTimeout(() => {
  console.log('Timeout 1');
}, 3000);

setTimeout(() => {
  console.log('Timeout 2');
}, 5000);

参见文档:

答案 1 :(得分:1)

让我看看我是否直截了当。 1-您希望每x分钟触发一次事件,除非现有流程已经结束? 2-你说只要有一个运行的设置间隔,节点就不会退出进程。 3-你说,因为你的过程运行"很多排队的异步函数"你不知道这个过程何时结束

我认为最简单的解决方案是将另一个间隔设置为以更高的频率运行,并在所有函数都返回时清除间隔。否则,您可能有兴趣阅读有关网络工作者的信息

https://www.npmjs.com/package/webworker-threads