node.js setTimeout *有时*比预期的要晚得多

时间:2013-12-03 17:49:14

标签: node.js settimeout

我有一个运行的nodejs程序,通常是正常的。它做了它的事情,然后睡了一会儿,然后醒来再做一次。这非常可靠。

它也会进行一些记录,因此我可以观察进度和状态:

[2013-Dec-03 08:01:13] setWakeup
[2013-Dec-03 08:01:13] job4 55 runs per hour
[2013-Dec-03 08:01:13] job4 sleep 59962ms, wake at 08:02:13
[2013-Dec-03 08:02:13] job4 awake
 ....

当它记录“sleep”时,实际上是调用带有指示的ms数量的setTimeout()。请注意,根据时间戳,“清醒”消息似乎在“睡眠”消息后大约60秒。

问题是......

有时这个setTimeout不会在预期的时间唤醒。我不是在谈论几毫秒甚至几个百分点的丢失。我说有时我想让它睡60秒,它会睡45分钟。看一下这个。

[2013-Dec-03 07:16:11] setWakeup
[2013-Dec-03 07:16:11] job4 54 runs per hour
[2013-Dec-03 07:16:11] job4 sleep 61297ms, wake at 07:17:12
[2013-Dec-03 08:01:08] job4 awake
 ....

请注意,“唤醒”消息在睡眠消息后约45分钟有一个时间戳。 这是在MacBook Pro上,节点v0.10.22 电脑是否可能进入睡眠状态?如何在setTimeout()数量的百分之几内可靠地唤醒它?

1 个答案:

答案 0 :(得分:0)

听起来你的Mac确实睡了。

您可以使用pmset(CLI工具)设置唤醒时间。查看手册页(man pmset),这可能来自Node:

var child_process = require('child_process');

// to set a specific wake up time:
child_process.spawn('pmset', [ 'schedule', 'wake', 'time', 'HH:MM:SS' ]);

(其中HH:MM:SS是您希望它唤醒的小时/分钟/秒时钟。)

但是,我不确定你是否可以让它足够可靠地唤醒以达到“在几个百分点内”。

我对setTimeout的内部工作原理还不熟悉,知道你的Mac是否会干扰它(因为它基本上会停止Node过程)。