2014-10-09 3 views
10

나는 이벤트 루프를 실험하고있다. 먼저 파일의 내용을 읽고 인쇄하는 간단한 코드로 시작합니다.Node.js 이벤트 루프 이해. process.nextTick()이 호출되지 않았습니다. 왜?

var fs = require('fs'); 
var PATH = "./.gitignore"; 

fs.readFile(PATH,"utf-8",function(err,text){ 
    console.log("----read: "+text); 
}); 

그런 다음 무한 루프에 배치합니다. 이 경우, readFile 함수는 절대로 실행되지 않습니다. 노드의 단일 스레드가 I/O 호출을 실행하지 않고 반복적으로 작업 중이기 때문에 오류가 아니라고 생각합니다.

while(true){ 
    var fs = require('fs'); 
    var PATH = "./.gitignore"; 

    fs.readFile(PATH,"utf-8",function(err,text){ 
     console.log("----read: "+text); 
    }); 
} 

그래서 I/O 호출에 루프와 얽힌 프로세스 시간이 할당되도록 할 수 있습니다. process.nextTick()으로 시도했지만 작동하지 않습니다.

while(true){ 
    process.nextTick(function(){ 
     fs.readFile(PATH,"utf-8",function(err,text){ 
      console.log("----read: "+text) 
     }); 
    }); 
} 

왜 작동하지 않습니까?

답변

24

while 회 돌이가 계속 실행 중이기 때문입니다. 다음 틱에서 할 일을 무한히 추가하는 것입니다. 놓아 버리면 노드 프로세스가 메모리 부족으로 인해 충돌합니다.

비동기 코드로 작업 할 때 일반 루프 및 제어 구조가 사용자를 트위스트시키는 경향이 있습니다. 그 이유는 이벤트 루프의 한 단계에서 동기식으로 실행되기 때문입니다. 이벤트 루프를 다시 제어 할 때까지 'nextTick'이 발생하지 않습니다.

이렇게 생각하면 코드가 실행될 때 이벤트 루프의 패스 B에 있습니다. 당신은 당신이 목록에 foo는 추가

process.nextTick(function foo() { do.stuff(); })' 

호출 할 때 '당신이 이벤트 루프의 C를 통과하기 전에 할 일이.' nextTick을 호출 할 때마다 목록에 하나 더 추가하지만 동기화 코드가 완료 될 때까지 아무 것도 실행하지 않습니다.

대신해야 할 일은 콜백에 '다음 일을하십시오'링크를 만드는 것입니다. 링크드 목록을 생각하십시오.

// var files = your list of files; 
function do_read(count) { 
    var next = count+1; 
    fs.readFile(files[count], "utf-8", function(err,text) { 
     console.log("----read: " + text); 

     if (next < files.length) { 
      // this doesn't run until the previous readFile completes. 
      process.nextTick(function() { do_read(next) }); 
     } 
    }); 
} 
// kick off the first one: 
do_read(files[0], 0); 

는 (분명히 이것은 인위적인 예입니다,하지만 당신은 아이디어를 얻을)

이 각각 '다음 파일'의 원인은 큐 이전 한 후에 만에-않는 'nextTick'에 추가 할을 완전히 처리되었습니다.

TL; DR : 대부분의 시간, 당신은 이전의 일을하는 데 도움이

희망

완료 될 때까지 다음 일을 시작하고 싶지 않아!

+1

뛰어난 설명, 감사합니다. JayKuri !! – codependent

+0

아주 좋은 설명은 process.nextTick에 대한 진술을 검증 할 수있는 증명을 줄 수 있습니까? 노드 또는 자바 스크립트에 의해 모든 문서처럼. –

+0

훌륭한 설명 - 이제 이해할 수 있습니다 ... – Guihgo

관련 문제