node.js - Nodejs setTimeout 循环在迭代数周后停止

标签 node.js express settimeout

已解决:这是一个 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/

相关文章:

javascript - 如何在发出Ajax请求时只等待1秒,但等待时间后不取消请求?

function - 在函数中实现代码时的 setTimeout 问题

javascript - Node.js 说它不能加载 sqlite3 模块,但无论如何

node.js - 如何从 Node.js 应用程序中获取 "Ping"?

android - Android 上的 node.js npm

express - 如何在 nginx 反向代理后面为两个 Web 应用程序提供服务

javascript - AngularJS - 在 $routeChangeStart 中运行 setInterval()

node.js - 是否可以为 Visual Studio Code 智能感知/自动完成定义自定义 npm 注册表?

mysql - '无法读取未定义的属性 'length'' nodeJS Mysql

javascript - 如何显示宽度为 :100% in Chrome 的表格