【问题标题】:Make function run every 2 seconds使函数每 2 秒运行一次
【发布时间】:2015-04-14 05:01:47
【问题描述】:

我有一个使用以下代码运行的服务器。我希望函数callAPI 每两秒调用一次,原谅凌晨 2:00-5:18 之间的时间。 API 报告说我每天进行超过 37,260 次 API 调用(0.5 次调用/秒 * 60 秒/分钟 * 60 分钟/小时 * (24-3.3) 小时)。为什么这会导致函数 callAPI 每天运行超过 37,260 次?

function callAPI(callback) {
  // Do API call
  callback()
}

function timer() {
  var d = new Date();
  var hour = d.getHours();
  if (hour == 2) {
    setTimeout(function() {
      callAPI(timer);
    }, 1000 * 60 * 60 * 3.3); // Set timeout to 3.3 hours (resumes at 5:18)
  } else {
    setTimeout(function() {
      callAPI(timer);
    }, 2000); // 2 seconds
  }
}

callAPI(timer)

【问题讨论】:

  • 它是如何运行的 - 是否可以多次触发?
  • API 说您使用了多少?您应该在这里使用 setInterval 而不是 setTimeout。
  • 您正在运行多少个节点应用程序实例?你应该确保你只运行一个实例。另外,我会使用winstongithub.com/winstonjs/winston之类的库将每个请求记录到文件中,以确定它发生的原因和时间
  • @TristanFoureur Node 是否比浏览器更好地处理 setInterval?因为如果你在调用 setInterval 之间有准确的间隔,那么在做这样的事情时通常最好避免。尽管我认为这实际上取决于该功能的作用以及 OP 在重叠方面的作用和不希望发生的情况
  • @SmokeyPHP 我通过 PM2 (github.com/Unitech/pm2) 生成服务器。 TristanFoureur,API 在极限处切断,所以我看不到确切的数字。 Charbz,我只通过这个运行一个实例。感谢温斯顿的推荐——我会调查的。

标签: javascript node.js


【解决方案1】:

getHours 函数返回一个介于 0 和 23 之间的数字。

因此,您每天可能会收到 12 * 60 * 30 次对 if 语句中第二个分支的额外调用。

【讨论】:

  • 您能进一步解释一下吗?似乎 getHours 总是会在每天的某个时间点返回 2 并适当地超时 3.3 小时。
  • 你是对的,它会在每天凌晨 3 点返回一个 2。目前,您对代码的期望似乎是每天 12 小时而不是 24 小时。
  • 实际上,有些事情并没有完全加起来......您究竟收到了多少额外的电话?
  • API 在极限处切断,所以我看不到确切的数字。限制是 50,000,因此它至少要额外调用约 13,000 次(50,000 - 37,260)。实际上,我只希望在凌晨 2 点到 5:18 之间不调用该函数。下午 2 点到 5 点 18 点很好,其他时间也一样。
猜你喜欢
  • 2012-01-09
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2020-06-09
相关资源
最近更新 更多