2017-04-06 74 views
0

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

现在我遇到了问题,我该如何每10分钟触发一次该功能。在工作过程的每一个事件上触发这个函数,并比较它是否比10分钟前更老。问题是:有些时候没有任何事件的时间多了,所以第二个选项是setInterval(),这里是我的问题:如果我使用setInterval,我的nodejs进程将永远不会结束,因此进程将无限运行直到间隔被清除。但是我也永远不知道什么时候应该调用clearInterval()

所以问题是:一种创建这种超时而不延长nodejs进程生命周期的方法。如果一切完成,它应该结束并忽略间隔的其余部分。

+0

仅供参考,您可以通过退出过程'的过程。退出()' –

+0

我知道,但这里没有答案,因为仍然是:我不知道,当主进程结束时。它完全是异步的,只有事件驱动。 Btw:process.exit()也跳过事件process.on(“beforeExit”) –

+0

我已经读过这个问题3次,我仍然不明白你在问什么......“有没有办法创建这种超时而不延长nodejs进程的使用寿命“< - 那么,你不需要间隔?你有没有看过'setTimeOut'呢? “但我也永远不知道什么时候应该调用clearInterval()”< - 所以它是基于事件的,但是没有事件可以帮助您知道何时清除间隔?你希望其他人知道吗? – Josep

回答

2

与此处的一些注释相反,这并不是一个奇怪的要求,即在进程运行时定期执行某些内容,而不会使进程无限运行,这将使其毫无意义。

有一个内置的机制。如果您不希望间隔(或超时)停止退出进程,则需要使用.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); 

请参阅该文档:

0

让我看看,如果我得到这个直。 1-您希望每x分钟触发一个事件,除非现有过程已经结束? 2-只要有一个运行的设置间隔,就表示该节点不会退出该进程。 3-你说,因为你的进程运行“很多排队的异步函数”,你不知道什么时候该进程应该结束

我认为最简单的解决方案是设置另一个间隔以更高的频率运行并清除所有函数都返回的时间间隔。否则,你可能有兴趣阅读webworkers

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

+0

.unref()将是更好的选择,因为接受的答案建议 –