Javascript NodeJs setInterval不延长进程生命周期
为了更好地理解我的需求,我简化了它:我必须做的任务是,我们有一个长的未知nodejs进程(有许多排队的异步函数,我们永远不知道它们何时完成或类似的事情),我们想要有一个更新进程,我们将当前进程状态存储在数据库中。为此,我们有一个启动(它存储“start”)和一个结束进程,该进程位于Javascript NodeJs setInterval不延长进程生命周期,javascript,node.js,asynchronous,settimeout,setinterval,Javascript,Node.js,Asynchronous,Settimeout,Setinterval,为了更好地理解我的需求,我简化了它:我必须做的任务是,我们有一个长的未知nodejs进程(有许多排队的异步函数,我们永远不知道它们何时完成或类似的事情),我们想要有一个更新进程,我们将当前进程状态存储在数据库中。为此,我们有一个启动(它存储“start”)和一个结束进程,该进程位于process.on('beforexit',function(){…})之上。现在我们必须处理客户要求的“仍在运行”流程。为此,我们希望每十分钟更新一次状态,以使用时间戳运行(此函数已存在,名为state.setRu
process.on('beforexit',function(){…})之上代码>。现在我们必须处理客户要求的“仍在运行”流程。为此,我们希望每十分钟更新一次状态,以使用时间戳运行(此函数已存在,名为state.setRunningState()
现在我有一个问题:如何每十分钟触发一次该函数。为此,我采用了在工作流程的每个事件上触发该函数的方法,并比较它是否比10分钟前更旧。问题是:有时没有任何事件的时间要长得多。所以第二个选项是setInterval()
我的问题是:如果我使用setInterval,我的nodejs进程将永远不会结束,因此进程将无休止地运行,直到清除Interval。但我也不知道什么时候应该调用clearInterval()
所以问题是:有没有一种方法可以在不延长nodejs进程生命周期的情况下创建这样一个超时。如果所有操作都完成了,那么它应该结束并忽略剩余的时间间隔。与这里的一些评论相反,在进程运行时定期执行某些操作而不使用ma,这并不是一个奇怪的要求king进程无限运行,这将使它变得毫无意义
这是一种内置机制。如果不希望间隔(或超时)停止进程退出,则需要使用.unref()
方法
而不是:
setInterval(() => {
console.log('Interval');
}, 1000);
使用:
如果没有其他未决事件,您的间隔将不会停止进程退出
尝试运行以下示例:
setInterval(() => {
console.log('Interval');
}, 1000).unref();
setTimeout(() => {
console.log('Timeout 1');
}, 3000);
setTimeout(() => {
console.log('Timeout 2');
}, 5000);
见文件:
让我看看我是否明白了这一点。
1-您希望每x分钟触发一次事件,除非现有进程已结束?
2-您说只要存在运行集间隔,节点就不会退出进程。
3-您说,由于您的进程运行“许多排队异步函数”,因此您无法知道进程何时结束
我认为最简单的解决方案是设置另一个间隔以更高的频率运行,并在所有函数都返回时清除该间隔,否则您可能会对阅读webworkers感兴趣
FYI您可以通过
process.exit()
退出流程,我知道这一点,但这里没有答案,因为:我仍然不知道主流程何时结束。它是完全异步的,只有事件驱动的。顺便说一句:process.exit()也跳过事件流程。on(“beforexit”)这个问题我已经读了三遍了,但我还是不明白你在问什么……”“有没有办法在不延长nodejs进程生命周期的情况下创建这样一个超时?”再次强调:我必须在时间间隔一侧解决它。setTimeout不会改变这一点,因为它必须递归使用。问题在于setTimeout的行为。这意味着我需要一个替代节点的基本超时处理的方法“我必须在时间间隔一侧解决它。”。unref()将是一个更好的选择,正如公认的答案所建议的那样
setInterval(() => {
console.log('Interval');
}, 1000).unref();
setTimeout(() => {
console.log('Timeout 1');
}, 3000);
setTimeout(() => {
console.log('Timeout 2');
}, 5000);