在 Node.js 中设置计时器
Posted
技术标签:
【中文标题】在 Node.js 中设置计时器【英文标题】:Setting a timer in Node.js 【发布时间】:2013-01-29 21:16:57 【问题描述】:我需要每 24 小时在 Node.js 中运行一次代码。我遇到了一个名为setTimeout
的函数。下面是我的代码sn-p
var et = require('elementtree');
var XML = et.XML;
var ElementTree = et.ElementTree;
var element = et.Element;
var subElement = et.SubElement;
var data='<?xml version="1.0"?><entries><entry><TenantId>12345</TenantId><ServiceName>MaaS</ServiceName><ResourceID>enAAAA</ResourceID><UsageID>550e8400-e29b-41d4-a716-446655440000</UsageID><EventType>create</EventType><category term="monitoring.entity.create"/><DataCenter>global</DataCenter><Region>global</Region><StartTime>Sun Apr 29 2012 16:37:32 GMT-0700 (PDT)</StartTime><ResourceName>entity</ResourceName></entry><entry><TenantId>44445</TenantId><ServiceName>MaaS</ServiceName><ResourceID>enAAAA</ResourceID><UsageID>550e8400-e29b-41d4-a716-fffffffff000</UsageID><EventType>update</EventType><category term="monitoring.entity.update"/><DataCenter>global</DataCenter><Region>global</Region><StartTime>Sun Apr 29 2012 16:40:32 GMT-0700 (PDT)</StartTime><ResourceName>entity</ResourceName></entry></entries>'
etree = et.parse(data);
var t = process.hrtime();
// [ 1800216, 927643717 ]
setTimeout(function ()
t = process.hrtime(t);
// [ 1, 6962306 ]
console.log(etree.findall('./entry/TenantId').length); // 2
console.log('benchmark took %d seconds and %d nanoseconds', t[0], t[1]);
//benchmark took 1 seconds and 6962306 nanoseconds
,1000);
我想每小时运行一次上述代码并解析数据。作为参考,我使用一秒作为计时器值。任何想法如何进行都会很有帮助。
【问题讨论】:
不是这样...您想每小时运行一次整个脚本,而不是指望节点进程始终处于活动状态。如果你在 linux 中查找 cron 作业。 @cwolves 我在 Windows 7 中,知道如何处理吗?? 如果您使用的不是与 linux 兼容的操作系统,那么请使用另一个执行相同操作的程序。 Windows Task Scheduler seems to be a popular answer. 我也同意@cwolves 的观点,因为你的 node.js 程序可能没有必要一直运行。这只是您系统中运行的另一个进程,这似乎没有必要。 cron 的想法是,它是一个管理器,用于按计划运行可能的许多脚本或作业,同时仅使用运行计划在当时运行的内容所需的系统资源。 TaskTimer - github.com/onury/tasktimer 【参考方案1】:基本上有三种方法可以去
setInterval()
setTimeout(f, n)
函数等待 n 毫秒并调用函数 f
。
setInterval(f, n)
函数每n
毫秒调用一次f
。
setInterval(function()
console.log('test');
, 60 * 60 * 1000);
这会每小时打印一次test
。您可以将您的代码(除了 require 语句)放入setInterval()
。然而,这对我来说似乎有点丑陋。我宁愿去:
计划任务 大多数操作系统都有调度任务的方法。在 Windows 上,这称为“Scheduled Tasks”,在 Linux 上查找 cron。
Use a libary 我在回答时意识到,甚至可以将其视为该问题的重复。
【讨论】:
setInterval 有错别字 Node.js 被安排在毫秒级别,建议您应该使用这些策略在 javascript 中将事情安排到很远的未来似乎是一个糟糕的建议。有很多事情会以意想不到的方式改变时间,让计算机进入睡眠/休眠状态等等。就像其他人建议的那样,在这种情况下,您应该将长期计划委托给基于 Microsoft 的系统程序。以上是关于在 Node.js 中设置计时器的主要内容,如果未能解决你的问题,请参考以下文章
我们可以在 -applicationWillTerminate 方法中设置一个计时器吗?