2011-05-07 71 views
7

我想为此进程添加一个小时的超时时间,以便在流死锁的情况下它不会永久保留。唯一的问题是如果我说setTimeout,流程没有机会提前结束。Node.JS:setTimeout不会保持进程运行

有没有办法在大约一个小时后进入强制退出超时而不保持进程运行?或者我坚持使用process.exit和没有这种超时做?

回答

12

unref加入节点,但现在这是一个可能的解决方案我不知道。重用马特的代码:

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

的医生说:

在setTimeout的情况下,当你UNREF您创建一个单独的计时器,将唤醒事件循环,创造了太多的这些可能产生不利影响的事件循环表现 - 明智地使用。

不要去野猪。

+1

不错,我没有听说过这个。 [节点0.9.1中增加了'unref'](https://github.com/joyent/node/releases/tag/v0.9.1) – 2013-12-30 15:21:31

5

如果您节省setTimeout返回的值可以随时取消其与clearTimeout闪光之前,像这样:

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

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

我希望有一些不需要'clearTimeout'的东西。我会不做。 – 2011-08-10 17:33:34

1

使用 new featurewas implemented作为process.watchers(),但我不知道是否也可能的解决方案它被包含在发布的版本中。在此帖子中,pull request仍然是开放的。

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

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

当它注意到它时,它会清除它的所有超时,导致一个)退出。

这当然也不是很大,因为

  • 概念没有得到证实。 (我不知道process.watchers()会返回什么样的数据,或者它是否还能正常工作)
  • 间隔是轮询方法。 (不是很好,如果你想在同一时间立即返回低CPU使用率)