所以我在我的 Raspberry Pi 设备上运行 OSMC,它本质上是 Debian + Kodi。我有一个 Node.js 应用程序正在运行,它告诉 Kodi(通过其 JSON-RPC API)在午夜播放一些视频。调度是非常基本的:算出下一个午夜的时间,减去当前时间,你就有了延迟传递给setTimeout
.
容易吧?除非它不起作用。第二天早上我进入办公室时,没有播放视频,根据日志,setTimeout
甚至从未调用过回调。
我做了一件显而易见的事情,将 Pi 的系统时钟设置为下午 23:58,启动我的程序,等了两分钟,果然:视频开始播放没有问题。如果间隔不是 1 天,但例如 10 分钟,它也可以正常工作。
然后我编写了最简单的 Node.js 程序,以增加时间间隔(1s、1m、5m、1h、8h 和 24h)安排一些日志;它还每小时打印一次当前时间:
function log(format) {
var args = Array.prototype.slice.call(arguments, 1);
console.log.apply(null, ['%s: ' + format, new Date()].concat(args));
}
function schedule(delay) {
setTimeout(function () {
log('callback called after %d ms', delay);
}, delay);
log('scheduled setTimeout(%d)', delay);
}
schedule(1000);
schedule(60 * 1000);
schedule(5 * 60 * 1000);
schedule(60 * 60 * 1000);
schedule(8 * 60 * 60 * 1000);
schedule(24 * 60 * 60 * 1000);
function logTime() {
log('current time is %s', new Date());
}
logTime();
setInterval(logTime, 60 * 60 * 1000);
这是我运行它时的输出screen
:
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(1000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(60000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(300000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(3600000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(28800000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(86400000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): current time is Mon Apr 25 2016 14:11:54 GMT+0200 (CEST)
Mon Apr 25 2016 14:11:55 GMT+0200 (CEST): callback called after 1000 ms
Mon Apr 25 2016 14:12:55 GMT+0200 (CEST): callback called after 60000 ms
Mon Apr 25 2016 14:16:55 GMT+0200 (CEST): callback called after 300000 ms
Mon Apr 25 2016 15:21:31 GMT+0200 (CEST): callback called after 3600000 ms
Mon Apr 25 2016 15:21:31 GMT+0200 (CEST): current time is Mon Apr 25 2016 15:21:31 GMT+0200 (CEST)
Mon Apr 25 2016 16:21:31 GMT+0200 (CEST): current time is Mon Apr 25 2016 16:21:31 GMT+0200 (CEST)
Tue Apr 26 2016 08:01:23 GMT+0200 (CEST): current time is Tue Apr 26 2016 08:01:23 GMT+0200 (CEST)
Tue Apr 26 2016 08:01:23 GMT+0200 (CEST): callback called after 28800000 ms
因此,短时间间隔按预期工作,但 1 小时回调和 8 小时回调都没有开始,直到我真正去检查输出。此外,大部分每小时的日志都丢失了。
有人可以解释这里发生了什么吗?
我正在运行 Node.js v5.10.1 但 v4.4.3 显示相同的行为。