2013-04-11 4 views
0

최근에 NodeJS (및 JS)를 읽었으며 NodeJs에서 콜 백이 작동하는 방식에 대해 약간 혼란 스럽습니다. 우리는 같은 것을 할 가정 :스택이 NodeJ에서 어떻게 작동합니까?

setTimeout(function(){ 
    console.log("World"); 
},1000); 
console.log("Hello"); 

출력 : "안녕하세요"

지금까지 내가 JS 이벤트 루프가 하나의 큰 스택하지만 것입니다 때문에 단일 스레드입니다 읽은 무엇에, 콜백 함수에 큰 호출을 두지 말라고 들었습니다.

1)

좋아, 그래서 내 첫 번째 질문은 하나의 스택을 가정한다하는 것은 콜백 함수는 메인 이벤트 루프 스레드에서 실행됩니까? 그렇다면 우리가 콜백 (db에서 가져오고 요청을 푸시)을 통해 콘텐츠를 제공하는 사이트를 가지고 있고 1000 개의 동시 사용자가 있는데 기본적으로 1000 명의 사용자가 기본적으로 동기식으로 서비스되고 있습니다. 메인 스레드가 각 콜백 함수에 들어갑니다. 그러면 메인 이벤트 루프가 계속 진행됩니까? 이 경우, 정확히 얼마나 동시입니까?

2) 어떻게 스택에 추가 콜백 기능이 그렇게 말할 수입니다 내 코드 같았다 다음

setTimeout(function(){ 
    console.log("Hello"); 
},1000); 
setTimeout(function(){ 
    console.log("World"); 
},2000); 

시간 제한도 발생하기 전에 다음 콜백 함수가 스택에 추가됩니까? 그렇다면 콜백 함수가 준비되어 있는지 (또는 다른 메커니즘이 있는지) 메인 스레드에 알리는 플래그가 설정되어 있습니다. 이것이 실제로 일어난다면, 특히 콜백 함수가있는 커다란 웹 애플리케이션의 경우에는 스택을 부 풀리지 않고, 스택이 클수록 쓰레드가 전체를 단계적으로 실행해야하기 때문에 더 오래 걸리는 모든 것이 실행됩니다.

답변

1

이벤트 루프는 스택이 아닙니다. 대기열 (first in/first out)과 같이 생각하는 것이 좋습니다. 가장 일반적인 사용법은 I/O 작업을 수행하는 것입니다.

디스크에서 파일을 읽으 려한다고 가정 해보십시오. 헤이,이 파일을 읽고 싶다고 말하기 시작하면, 읽은 후에이 콜백을 호출하십시오. 실제 I/O 작업이 별도의 프로세스에서 수행되는 동안 노드 응용 프로그램은 다른 작업을 계속 수행 할 수 있습니다. 파일 읽기가 완료되면 완료를 나타내는 항목을 이벤트 루프의 대기열에 추가합니다. 노드 응용 프로그램은 여전히 ​​다른 작업을 수행 중일 수 있습니다. 또는 다른 항목이 대기열에서 먼저 대기 될 수 있지만 결국에는 완료 알림이 노드의 이벤트 루프에 의해 대기열에서 제외됩니다. 이것을 콜백과 일치시키고 콜백이 예상대로 호출됩니다. 콜백이 반환되면 이벤트 루프는 다음 항목을 대기열에서 제외하고 계속합니다. 노드의 이벤트 루프에 아무것도 남아 있지 않으면 응용 프로그램이 종료됩니다.

대략적인 기술적 설명이 아닌 이벤트 루프의 대략적인 근사치입니다.

특정 setTimeout의 경우 우선 순위 대기열처럼 생각하십시오. 노드는 이상으로 적어도 시간이 경과 할 때까지 항목/작업/콜백을 대기열에서 제외하는 것을 고려하지 않습니다.

혼란 스러울 때마다 읽고 싶은 노드/자바 스크립트 이벤트 루프에는 많은 글이 많이 있습니다.

1

발신자 함수에 콜백 함수가 추가되지 않습니다. 여기에는 재귀가 없습니다. 이벤트 루프에서 호출됩니다. 귀하의 예에서 console.log을 교체하고 결과를 보도록하십시오 - 스택은 성장하지 않습니다.

관련 문제