Node.JS:不保持进程运行的setTimeout

时间:2011-05-07 21:38:53

标签: node.js timeout settimeout lifecycle

我想为此进程添加一个小时的超时,以便在流死锁的情况下它不会永远停留。唯一的问题是如果我说setTimeout,那么这个过程就没有机会提前结束。

有没有办法在大约一个小时后进入强制退出超时,而不保持进程运行?或者我是否在使用process.exit和没有超时之间停留?

3 个答案:

答案 0 :(得分:15)

我不知道何时将unref添加到Node,但现在这是一种可能的解决方案。重用马特的代码:

var timeoutId = setTimeout(callback, 3600000);
timeoutId.unref(); // Now, Node won't wait for this timeout to complete if it needs to exit earlier.

医生说:

  

在setTimeout的情况下,如果你没有创建一个单独的计时器来唤醒事件循环,创建太多这些可能会对事件循环性能产生负面影响 - 明智地使用。

不要随便吃它。

答案 1 :(得分:6)

如果您保存setTimeout返回的值,则可以在clearTimeout触发之前取消它,如下所示:

var timeoutId = setTimeout(callback, 3600000); // 1 hour

// later, before an hour has passed
clearTimeout(timeoutId);

答案 2 :(得分:1)

使用new feature was implemented作为process.watchers()的{​​{3}}可能的解决方案,但我不知道它是否已包含在已发布的版本中。截至此帖,pull request仍然有效。

但一般来说,您会编写一个自定义setTimeout函数,将所有超时添加到计数器,并且在回调超时之前,它将从计数器中删除。

然后创建一个持续间隔,并且间隔将检查并注意所有步行者何时只是您的自定义函数设置的超时。

当它注意到这一点时,它会(清除所有那些超时,导致)退出。

这当然不是很好,因为

  • 这个概念没有得到证实。 (我不知道process.watchers()将返回什么类型的数据,或者它是否仍然有效)
  • 间隔是一种轮询方法。 (如果你想在低CPU使用率的同时立即返回,那就不好了)