代码之家  ›  专栏  ›  技术社区  ›  SpiRail

经过数周的迭代后,nodejs setTimout循环停止

  •  2
  • SpiRail  · 技术社区  · 6 年前

    解决了的 :这是一个节点错误。在大约25天(2^32毫秒)后发生,有关详细信息,请参阅答案。

    这个循环的迭代次数最大吗?

    function do_every_x_seconds() {
        //Do some basic things to get x
        setTimeout( do_every_x_seconds, 1000 * x );                                                                
    };  
    

    我在Ubuntu上运行一个express服务器,有很多超时循环。 每秒钟运行一个循环,基本上打印时间戳。 每30到300秒运行一次。

    一切看起来都很好。然而,在25天没有任何使用,数百万次迭代之后,节点实例仍然处于运行状态,但三个setTimout循环都已停止。根本不报告错误消息。

    我不确定它是否相关,但我也使用--expose gc标志运行nodejs并执行定期垃圾收集,并监视内存是否在可接受的范围内。

    它是一个开发服务器,所以我把实例放在上面,以防有人建议我可以做些什么来进一步研究这个问题。

    是不是因为事件循环丢失了所有的计时器?

    2 回复  |  直到 6 年前
        2
  •  2
  •   zero298    6 年前

    setTimeout 活跃于 设置超时 can setInterval drift over time? 其中一个相关的问题是: setInterval interval includes duration of callback #7346 .

    cron 代替执行任务的任务。它们更具弹性,故障在系统级记录在日志中,而不是从节点进程中记录。

    Node.js setTimeout for 24 hours - any caveats? 其中提到使用npm包 cron 任务调度。