因此,为了获得像 setTimeout 这样的最佳时间速率,我们希望给定模块的事件循环尽可能小。这最大限度地减少了 V8 引擎为循环做功的时间。最佳情况:
setInterval(function(){}, 50);
如果这是文件中唯一的东西,那么精度会非常高,因为没有其他事情发生。所以,我们所做的是,我们为特定模块创建一个进程,该进程只执行我们希望在此时间间隔内完成的工作。如果函数中唯一的东西是异步请求,它和上面一样好。因此,我们在 setInterval 函数上获得了非常高的精度。
在一个文件中,我们需要以下内容,我们将其命名为 file1.js。
var http = require('http');
var options = {
hostname: 'localhost',
port: 8888,
path:'/',
method: 'GET'
}
setInterval(function(){
console.log('File:' + (new Date).getTime() % 50);
//The Modulus of the time in MS should change by no more than 1 MS on consecutive runs, I confirmed this works just dandy on my system(though the first couple intervals were slower in some instances, worse I saw was a 3 MS delay)
var req = http.request(options, function (res) {
res.on('data', function (data) {
console.log(data.toString());
});
});
req.end();
}, 50);
在第二个文件中,我们可以做更多的工作,无论我们实际想要什么工作。重要的是我们生成了一个进程来完成上述工作,包含在它的 OWN PROCESS 中。这允许进程 V8 处理器保持这个事件循环非常小。我们仍然是 CPU 上给定进程的操作系统管理的受害者,但我们仍然可以期望我们的 file1.js 模块至少每毫秒得到一次关注,因为它所做的只是一个异步调用,然后是寻找下次它需要启动所说的异步调用时,我们在调用之间得到的最大延迟是 1 毫秒(至少这是我在系统上看到的全部)。因此,另一个文件可以包含任意数量的工作,以及一个非常重要的行:
文件2.js:
var http = require('http');
var child_process = require('child_process');
http.createServer(function (req, res) {
res.write('Hi There');
res.end();
}).listen(8888);
///Do whatever else you need to do
child_process.fork('file1.js');//Add in this line!!!!
预期输出:
File:29
Hi There
File:29
Hi There
File:30//Notice these values only increase by 0 or 1.
Hi There
File:31
Hi There
File:31
Hi There
File:32
Hi There
File:34//Uh oh, one went up by 2... not terrible
Hi There
File:35
Hi There
File:35