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

Posted

技术标签:

【中文标题】Node.JS:不保持进程运行的 setTimeout【英文标题】:Node.JS: setTimeout that does not keep the process running 【发布时间】:2011-08-20 22:00:24 【问题描述】:

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

有没有办法在大约一小时后强制退出超时,而不保持进程运行?还是我在使用 process.exit 和不使用此超时之间陷入困境?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我希望得到不需要clearTimeout 的东西。我会做的。 有什么理由不使用clearTimeout?表演还是宗教? @Romick,这是有充分理由的。如果您创建使用超时(或间隔 - unref() 也适用于间隔)的方法或库,您不希望代码的使用者必须了解代码的内部细节,并要求他们调用关闭或关闭方法来清理您的计时器。我刚刚创建了代码来跟踪世界各国夏令时不断变化的规则。默认情况下,我的代码每天轮询一次以查找更新。使用 unref(),我的用户无需担心会终止我使用的时间间隔。【参考方案2】:

使用new feature 和was implemented 作为process.watchers() 的可能解决方案,但我不知道它是否包含在已发布的版本中。 pull request 在这篇文章中仍然开放。

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

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

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

这当然不是很好,因为

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

【讨论】:

【参考方案3】:

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

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 was added in Node 0.9.1.

以上是关于Node.JS:不保持进程运行的 setTimeout的主要内容,如果未能解决你的问题,请参考以下文章

如何强制阻止 Node.js 进程终止?

node.js 进程如何知道何时停止?

在运行不受信任的用户代码时阻止 Node.js 中的系统调用

当服务器关闭/崩溃时,Node JS 会自动重启所有永远的 JS 进程

NodeJS Node-apn 实现作为守护进程

每日灵魂一问-浅谈node.js中的process