在node.js中长时间运行无穷大

时间:2015-11-27 22:25:13

标签: node.js loops

无法理解一件事。在服务器上,我有一些在异步模式下永远运行的进程。例如:

MenuItem menuItem = menu.findItem(R.id.your_menu_item);
Drawable drawable = menuItem.getIcon();
if (drawable != null) {
    // If we don't mutate the drawable, then all drawable's with this id will have a color
    // filter applied to it.
    drawable.mutate();
    drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
    drawable.setAlpha(alpha);
}

它的recusrion,据我所知它必须导致堆栈溢出和(或)吃掉内存。 如何在node.js中没有内存泄漏的情况下永远长时间运行?有可能吗?

1 个答案:

答案 0 :(得分:3)

如果你想反复做一些事情,并且想要以一种友好的方式进行操作,这样就可以处理服务器中其他事件的周期,那么通常的方法是使用setInterval()

setInterval(function() {
    console.log("called");
}, 1000);

重复调用与process.nextTick()相同的函数并不是真正的递归,并且不会导致堆栈溢出,因为堆栈在事件队列下次调用函数之前完全展开。它完成当前的执行路径,然后调用您传递给nextTick()的函数。

您对此类操作的选择是:

setInterval()
setTimeout()
setImmediate()
process.nextTick()

所有三个选项都允许当前执行线程在调用回调函数之前完成,因此没有堆栈构建。

setInterval()在将来的一段时间内使用系统计时器设置,并允许在调用setInterval()回调之前为计时器时间发生之前当前在队列中或队列中的所有其他事件提供服务。如果建议在回调调用之间暂停一段时间并且您希望一遍又一遍地重复调用回调,请使用setInterval()

setTimeout()在将来的一段时间内使用系统计时器设置,并允许在调用setTimeout()回调之前为计时器时间发生之前当前在队列中或队列中的所有其他事件提供服务。您可以重复使用setTimeout()(从每个回调设置另一个超时),尽管这通常是setInterval()的设计目的。 node.js中的setTimeout()没有遵循浏览器所做的最短时间间隔,因此setTimeout(fn, 1)会很快被调用,但不会像setImmediate()process.nextTick()那样快。实施差异。

只要事件队列中的其他事件都已得到服务,

setImmediate()就会立即运行。因此,这是“公平的”#34;到系统中的其他事件。注意,这比setTimeout(fn, 0);更有效,因为它不需要使用系统计时器,但是被编码到事件子系统中。当您希望堆栈展开并希望首先处理队列中已有的其他事件时,请使用此选项,但您希望尽快运行回调。

process.nextTick()在当前执行线程完成后运行(并且堆栈展开),但是在当前事件队列中的任何其他事件之前运行。这不公平"如果你用process.nextTick()一遍又一遍地运行某些东西,你将会饿死处理其他类型事件的系统。它可以在堆栈展开后尽快运行一次,但不应反复使用。

一些有用的参考资料:

setImmediate vs. nextTick

Does Node.js enforce a minimum delay for setTimeout?

NodeJS - setTimeout(fn,0) vs setImmediate(fn)

setImmediate vs process.nextTick vs setTimeout