따라서에서는 setTimeout 같은위한 최적의 시간 속도를 acheive하기 위해 우리는 주어진 모듈에 대한 이벤트 루프를 가능한 작게 유지하려고합니다. 이렇게하면 V8 엔진이 루프 작업에 소비하는 시간을 최소화 할 수 있습니다. 최상의 경우 시나리오 :
setInterval(function(){}, 50);
이 파일의 유일한 경우 정확성은 매우 높습니다. 그 밖의 일은 일어나지 않기 때문입니다. 그래서 우리가하는 일은 우리가이 구간에서하고 싶은 일만하는 특정 모듈에 대한 프로세스를 포크하는 것입니다. 함수 내의 유일한 것이 비동기 요청 인 경우 위와 같습니다. 따라서 우리는 setInterval 함수에서 매우 높은 정밀도를 얻습니다.
하나의 파일에서 다음 내용을 원한다면이 파일을 호출 할 것입니다 .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);
두 번째 파일에서 우리는 실제로 원하는 모든 작업을 수행 할 수 있습니다. 중요한 것은 위의 작업을 수행하는 프로세스를 생성하여 해당 프로세스에 포함시키는 것입니다. 이를 통해 프로세스 V8 프로세서는이 이벤트 루프를 매우 작게 유지할 수 있습니다. 우리는 여전히 CPU상의 주어진 프로세스의 운영체제 관리의 희생자이지만, 우리는 file1.js 모듈이 적어도 밀리 초마다 한 번씩주의를 기울일 것을 기대할 수 있습니다. 왜냐하면 모든 것이 비동기 호출이기 때문에 찾고 있습니다. 다음 번 비동기 호출을 시작해야 할 때 호출간에 가장 많이 지연되는 시간은 1ms입니다 (최소한 시스템에서 본 것 모두입니다). 따라서 다른 파일에는 많은 양의 작업과 하나의 매우 중요한 행이 포함될 수 있습니다.
file2.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
John Resig의 "[JavaScript 타이머 작동 방법] (http://ejohn.org/blog/how-javascript-timers-work/)"을 참조하십시오. –
하지만,'setTimeout'의 함수가'new Date(). getTime()'만 쓸 때에도 여전히 완전히 신뢰할 수 없습니다! –
게시물은 얼마나 자주 이벤트 루프가 유휴 상태인지에 따라 안정성을 설명합니다. 다른 작업으로 바쁜 경우 타이머는 해당 작업이 완료 될 때까지 기다려야합니다. 'timeout' 값은 단지 * 최소 * 일 뿐이며 보장은 아닙니다. –