已解决:这是一个 Node 错误。发生在大约 25 天(2^32 毫秒)后,请参阅答案了解详细信息。
此循环是否有最大迭代次数?
function do_every_x_seconds() {
//Do some basic things to get x
setTimeout( do_every_x_seconds, 1000 * x );
};
据我了解,这被认为是让事情定期运行的“最佳实践”方式,所以我非常怀疑它。
我正在 Ubuntu 上运行一个带有多个超时循环的 Express 服务器。 每秒运行一个循环并基本上打印时间戳。 每 5 秒调用一次外部 http 请求 每 X 30 到 300 秒运行一次。
这一切似乎运作良好。然而,在 25 天没有任何使用以及数百万次迭代之后, Node 实例仍然运行,但所有三个 setTimout 循环都已停止。根本没有报告任何错误消息。
更奇怪的是,Express 服务器仍在运行,我可以加载 http 站点,该站点打印到与打印周期性时间戳相同的控制台。
我不确定它是否相关,但我还使用 --expose-gc 标志运行 nodejs 并执行定期垃圾收集并监视内存是否在可接受的范围内。
它是一个开发服务器,因此我保留了该实例,以防有一些关于我可以采取哪些措施来进一步研究该问题的建议。
事件循环是否会以某种方式删除所有计时器?
最佳答案
我有a similar problem with setInterval()
.
我认为这可能是由 Node.js 中的以下错误引起的,该错误最近似乎已修复:setInterval callback function unexpected halt #22149
更新:看来修复已在 Node.js 10.9.0 中发布.
关于node.js - Nodejs setTimeout 循环在迭代数周后停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51826266/