【问题标题】:NodeJs setInterval without extending process life timeNodeJs setInterval 不延长进程生命周期
【发布时间】:2017-04-06 12:10:06
【问题描述】:

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

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

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

【问题讨论】:

  • 仅供参考,您可以通过process.exit()退出该过程
  • 我知道,但这里没有答案,因为仍然:我不知道主进程何时结束。它是完全异步的,只有事件驱动。顺便说一句:process.exit() 也跳过事件 process.on("beforeExit")
  • 我已经阅读了这个问题 3 次,但我仍然无法理解您在问什么......“有没有办法在不延长 nodejs 进程的生命周期的情况下创建这样的超时" setTimeOut吗? “但我也不知道什么时候应该调用 clearInterval()”
  • 再次:我必须在区间的一侧解决它。 setTimeout 不会改变这一点,因为它必须递归使用。问题在于 setTimeout 的行为。意味着我需要替代 nodejs 的基本超时处理
  • “我必须在区间的一边解决它。”

标签: javascript node.js asynchronous settimeout setinterval


【解决方案1】:

与这里的一些 cmets 不同,在进程运行时定期执行某些操作而不使进程无限运行,这将使其毫无意义,这并不是一个奇怪的要求。

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

查看文档:

【讨论】:

    【解决方案2】:

    让我看看我是否明白这一点。 1-除非现有流程已结束,否则您想每 x 分钟触发一次事件吗? 2-您说只要有运行设置间隔,该节点就不会退出该进程。 3-您说,由于您的进程运行“许多排队的异步函数”,因此您不知道该进程应该何时结束

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

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

    【讨论】:

    • .unref() 将是一个更好的选择,因为接受的答案表明
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2015-05-03
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多