gpt4 book ai didi

node.js - Node.js 中长时间运行的无限

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:57 29 4
gpt4 key购买 nike

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

function loginf() {
console.log(1+1);
process.nextTick(loginf);
}
loginf();

它的递归,据我了解,它一定会导致堆栈溢出和(或)占用内存。如何在node.js中永远长时间运行而不发生内存泄漏?可能吗?

最佳答案

如果您想重复执行某些操作,并且希望以友好的方式执行此操作,从而为服务器中的其他事件留下周期以进行处理,那么通常的方法是使用 setInterval()

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

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

您对此类操作的选择是:

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

所有三个选择都让当前执行线程在调用回调函数之前完成,因此不会堆积堆栈。

setInterval() 使用为 future 某个时间设置的系统计时器,并允许在调用 setInterval() 回调之前处理当前队列中或计时器时间发生之前队列中的所有其他事件。当建议在回调调用之间暂停一段时间并且您希望一遍又一遍地重复调用回调时,请使用 setInterval()

setTimeout() 使用为 future 某个时间设置的系统计时器,并允许在调用 setTimeout() 回调之前处理当前队列中或计时器时间发生之前队列中的所有其他事件。您可以重复使用 setTimeout()(为每个回调设置另一个超时),尽管这通常是 setInterval() 的设计目的。 Node.js 中的 setTimeout() 不遵循浏览器执行的最小时间间隔,因此 setTimeout(fn, 1) 会很快被调用,但由于实现差异,不如 setImmediate()process.nextTick() 快。

一旦当前事件队列中的其他事件全部得到服务,

setImmediate() 就会运行。因此,这对于系统中的其他事件是“公平的”。请注意,这比 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

关于node.js - Node.js 中长时间运行的无限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33965494/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com