Node.js setTimeout 24小时 - 有什么需要注意的吗?

14

简单问题,我想在 Node.js 中设置 24 小时或 12 小时的超时时间,以便每天定期检查某些数据库数据并清除任何可疑的垃圾。这么做会有可能造成任何性能问题或其他潜在的问题吗?即使在毫秒级别上不是准确的 12-24 小时,而且即使服务器崩溃也无所谓,因为我无论如何都会在服务器启动时运行相同的垃圾回收器。

结论:

  • 我没有使用本机操作系统 cron 来运行单独的脚本,因为我需要在该脚本中访问当前的 Node.js 进程数据。
  • 最终,我决定使用 https://www.npmjs.com/package/cron 包,因为它可以在特定时间进行调度(可能在服务器负载较低的时间)。
  • 感谢大家快速的回复!
3个回答

11
我成功地使用了包cron,它使用简单,通常与CronTab兼容。我有一个每月运行一次的工作,从去年开始一直可靠运行,所以我可以证明它的有效性。
话虽如此,这个包内部最终只是使用了setTimeout,所以您使用该方法也没有什么实际问题。如果您的超时时间太大(大于JavaScript整数的最大值),可能会出现问题,但1000 * 60 * 60 * 24要小得多。
显然,如果您的系统崩溃或脚本因其他原因崩溃,则超时将不起作用。
如果可用的话,您还可以直接使用crontab(或Windows任务计划)。

澄清一下:cron是处理crontab文件的Unix/Linux守护程序。这个守护程序(“服务”)一直在系统上运行,监视crontab文件,并在适当的时间启动活动。其他操作系统的处理方式可能不同...但是每个操作系统都会有相应的处理方式。 - Mike Robinson
@MikeRobinson 是的,感谢您的澄清。在Unix上,只需运行crontab -e来设置它,然后指向一个脚本就可以了。您甚至可以使用Node解释器来运行JavaScript脚本! - Explosion Pills
问题是,我需要从这个脚本访问当前Node.js应用程序的内部数据,因此我不认为通过操作系统运行单独的脚本是一个好的选择。顺便说一下,是的,我在Unix上。Cron模块看起来很有趣,我还在阅读相关内容,如果它所做的只是在应用程序中最终运行setTimeout并提供方便的功能,那么我将继续使用普通的setTimeout。 - Max Yari
另一方面,我可以在特定的时间设置它执行任务,这样当服务器负载最小的时候是非常有用的。如果像Mike所说的那样,cron包使用本地Unix服务,那就太棒了。我想我会选择这个选项,感谢您的回复,祝您拥有愉快的一天=) - Max Yari

4
个人而言,我会使用Unix/Linux中的定时任务,或者在Windows中使用“计划任务”来完成这种工作。无论哪种情况,工作都将完全由服务器完成...因此,没有理由让JavaScript应用程序(在“其他某个”计算机上)参与其中。
更一般地说,不要告诉某人“睡12小时后醒来”,并相信他们会按时醒来。相反,使用闹钟。计算活动[下一次]应发生的绝对时间,然后确保该活动不早于该时间发生。安排实际需要做工作的计算机,在适当的时间执行工作,使用该计算机上可用的任何调度设施。

但是如果 setTimeout没有任何问题,这意味着您可以在某些嵌套的内部范围内创建超时并仍然可以访问变量等。使用外部进程启动它可能会很复杂。 - James Thorpe
这里的JavaScript是针对Node.js的,意味着它将在服务器端代码中完成并超时,不涉及第三方。 - Max Yari
抱歉,Max,但我真的不明白你在这里的意思。JavaScript 代码是在“所讨论的服务器”上执行吗?我通常不认为这种情况会发生。 - Mike Robinson
@MikeRobinson 对不起,迈克,我没有看到你的这条评论。是的,如果还不清楚,JavaScript 在服务器上执行(来自最初的问题),也就是在服务器代码内部执行。这是一个 Node.js 服务器,Node.js 基本上是运行在 JavaScript 上的。 - Max Yari
好的。虽然有点不寻常,但还是可以的。尽管如此,我认为服务器应该是“响应”的。有什么东西推动它,然后它才会移动。如果有一个纯粹的维护任务需要在“每晚1点”执行,那么我不会使用Node.js来完成这个任务。我会使用cron或其等效物。 - Mike Robinson

1

在我看来,完全不应该有任何问题,但是使用操作系统的cron作业做这件事情会更好。这将使用操作系统定时器,调用你的node应用程序;这将对每个人都清晰明了,即使是从未见过node或JavaScript运作的人也能理解。此外,它还会自动保护您免受长期内存泄漏的影响,因为您的应用程序将在每次迭代后被终止。


你的意思是要创建一个单独的应用程序来完成这项工作吗?我的node.js应用程序是一个服务器,它一直在接收HTTP和TCP请求。实际上,为了判断什么是垃圾,我需要访问这个应用程序的内部数据,比如套接字集合。可以将这些数据导出并尝试在数据库中同步运行,但对于这样一个简单的任务来说,感觉有点过于复杂了。 - Max Yari
正如我上面所说,我猜我并不完全理解你的设置。 我认为“javascript”只在“远离计算机的浏览器中运行”,因此,即使这两个活动确实在同一台计算机上运行,我“非常怀疑”这是否真的是最好的方法。 当然,我可能错了,所以我并不是说错了... - Mike Robinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接