0

所以我在我的 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 显示相同的行为。

4

1 回答 1

0

显然这是一个已知问题:https ://github.com/nodejs/node/issues/4262

于 2016-04-27T11:20:15.753 回答