2013-07-10 2 views
10

우선 Node.Js가 무엇인지 이해하려고 시도합니다. 두 가지 질문이 있습니다.

Node.js의 단일 스레드 및 이벤트 루프

첫 번째 질문은 펠릭스의 the article에서, 그것은 "그 콜백 실행이 완료 될 때까지 단지 다른 모든 콜백이 줄을 기다려야한다. 동시에 발사 한 콜백이있을 수있다"고 말했다.

  1. 먼저 HTTP 요청 이벤트를 수신 :

    그런 다음, 두 개의 클라이언트 요청이 동시에 수신하는 경우, 그것은 다음과 같은 워크 플로우를 의미

    var http = require('http'); 
    http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
    }).listen(8124, "127.0.0.1"); 
    

    (공식 웹 사이트 nodejs에서 복사) 다음 코드에 대한 고려 , 두 번째 요청 이벤트가 수신되었습니다.

  2. 첫 번째 이벤트가 수신되자 마자 첫 번째 이벤트의 콜백 기능이 실행 중입니다.
  3. 두 번째 이벤트에 대한 콜백 함수가 대기해야합니다.

맞습니까? 내가 옳다면, 어떻게 Node.js 매우 짧은 시간 내에 클라이언트 요청의 수천이 있다면 제어 할 수 있습니다.

두 번째 질문
용어 "이벤트 루프는"대부분 Node.js를 주제로 사용된다. 나는 "이벤트 루프"를 다음과 같이 이해했다. http://www.wisegeek.com/what-is-an-event-loop.htm;

이벤트 루프 - 또는 주 루프는 이 초기 이벤트 다음에 이벤트를 제어하고 전달하는 프로그램 내의 구성입니다.

초기 이벤트가 키보드의 버튼을 누르거나 Node.js를에 (프로그램의 버튼을 클릭 포함하여 아무 것도, 할 수있다, 나는 초기 이벤트는 HTTP 요청, DB 쿼리 또는 I/O 파일 될 것이라고 생각 접속하다).

이 이벤트 서클 때문이 아니라, 루프를 불러 지속적으로 발생하지만 루프가 이벤트를 준비 때문에,의 이벤트를 확인하는 이벤트를 전달하고 다시 한번 과정을 반복한다.

나는 "다시 한번 과정을 반복 "두 번째 단락에 대한 충돌, 특히 문구가 있습니다. 위의 질문에서 위의 http.createServer 코드가 반복적으로 HTTP 요청 이벤트를 수신하기 때문에 절대적으로 "이벤트 루프"라는 것을 인정했습니다.

하지만 다음 코드를 이벤트 구동 또는 이벤트 루프로 식별하는 방법을 알지 못합니다. db 쿼리가 끝난 후에 발생하는 콜백 함수를 제외하고는 아무것도 반복하지 않습니다.

database.query("SELECT * FROM table", function(rows) { 
    var result = rows; 
}); 

제발, 당신의 의견과 대답을 들려주세요.

답변

7

답변 하나, 귀하의 논리가 올바른지 : 두 번째 이벤트가 기다립니다.대기열에있는 콜백 시간까지 실행됩니다.

또한 기술 세계에는 "동시에"같은 것이 없다는 것을 기억하십시오. 모든 것은 매우 특정한 장소와 시간을 가지고 있습니다.

node.js가 수천 개의 연결을 관리하는 방식은 논리를 차단하는 데이터베이스 호출이 있거나 다른 스트림 작업 (예 : 스트림)이 처리되는 동안 스레드 유휴 상태를 유지할 필요가 없다는 것입니다. 첫 번째 요청을 "제공"할 수 있으며, 콜백을 더 많이 생성하고 다른 요청을 진행할 수 있습니다.
실행을 차단할 방법이 없기 때문에 (말도 안되는 (true) 및 유사), 애플리케이션 로직 전체에 실제 리소스를 분산시키는 데 매우 효율적입니다.

스레드 - 비용이 많이 들고 스레드의 서버 용량이 사용 가능한 메모리와 직접 관련됩니다. 따라서 고전적인 웹 응용 프로그램의 대부분은 RAM이 단순히 유휴 상태 인 스레드에서 사용되는 반면 데이터베이스 쿼리 블록은 계속 발생하거나 유사하기 때문에 문제가 발생합니다. 대소 문자가 아닌 노드.

아직도, 그것은 그 심지어 더 많은 가능성을 확장, cluster을 통해 (child_process로) 여러 스레드를 만들 수 있습니다.

대답 두. 당신이 생각할 수있는 "루프"같은 것은 없습니다. 연결이나 데이터가 수신되었는지 등을 검사하는 장면 뒤에는 루프가 없습니다. 요즘 Async 메서드에서도 처리됩니다.

응용 관점에서 볼 때 개발자의 관점에서 볼 때 모든 것이 이벤트 중심 (이벤트 루프가 아님)입니다.

http.createServer의 경우 콜백을 요청에 대한 응답으로 바인딩합니다. 모든 소켓 작업과 IO 작업은 HTTP 핸드 셰이 킹, 헤더, 쿼리, 매개 변수를 파싱하는 것뿐만 아니라 백그라운드에서 발생합니다. 장면 뒤에서 발생하고 작업이 완료되면 데이터가 유지되고 콜백이 일부 데이터와 함께 이벤트 루프로 푸시됩니다. 이벤트 루프가 자유롭고 시간이 지나면 node.js 응용 프로그램 컨텍스트에서 콜백이 백그라운드에서 데이터로 실행됩니다.

데이터베이스 요청시 - 동일한 이야기. 그것은 준비가 안되고 물건을 요청합니다 (다시 비동기로 수행 할 수도 있습니다). 그런 다음 데이터베이스가 응답하고 데이터가 응용 프로그램 컨텍스트를 위해 준비되면 콜백합니다.

는 Node.js를 함께 필요로하는 모든 이벤트의 구현 개념을 이해하는 것입니다,하지만, 정직합니다. 가장 좋은 방법은 실험입니다.

+0

'createServer'에 콜백 (비동기) 연산이 있으면 어떻게 될까요? 먼저 요청하면 프로세스가 일부 동기화 작업에서 콜백을 트리거하고 즉시 처리 할 수 ​​있습니까? 그리고 첫 번째 요청에서 콜백이 실행되는 동안 두 요청을 처리 시작? – Manali

1

1) 네, 맞습니다.

노드를 사용하여 수행하는 모든 작업이 주로 I/O 바인딩이므로 작동합니다.

새 요청 (이벤트)이 들어 오면 대기열에 넣습니다. 초기화시, Node는 네트워크/소켓 호출, 데이터베이스 등과 같이 I/O 바운드 처리를 위해 스레드를 생성하는 ThreadPool을 할당합니다 (이것은 비 블로킹 임). 당신이하고있는 일의 대부분은 대부분 CRUD 및 I/O 작업에 집중하지 CPU이기 때문에

지금, 당신의 "콜백"(또는 이벤트 핸들러는) 매우 빠르다.

따라서 이러한 콜백은 실제로 병렬 작업이 ThreadPool (멀티 스레딩)을 통해 수행되기 때문에 실제로 콜백이 수행되지 않는 반면 콜백은 이러한 스레드에서 결과를 수신하여 처리가 계속되고 클라이언트에 응답을 되돌려 보낼 수 있습니다. 당신의 콜백 무거운 CPU 작업을하는 경우, 당신은 당신이 초당 요청 수천을 처리 할 수 ​​없습니다 확신 할 수 있으며 멀티 스레드에 비해, 정말 나쁜 스케일 다운 :

당신은 쉽게 확인할 수 있습니다 체계.

2) 당신이 맞습니다.

이러한 모든 추상화로 인해 백그라운드에서 진행되는 작업을 이해하기 위해서는 다이빙을해야합니다. 그러나 예, 루프가 있습니다.

특히 Nodejs는 libuv으로 구현됩니다.

흥미로운 점은 read입니다.

하지만 다음 코드를 이벤트 구동 또는 이벤트 루프로 식별하는 방법을 알지 못합니다. db 쿼리가 끝난 후에 발생하는 콜백 함수를 제외하고는 아무것도 반복하지 않습니다.

이벤트 구동은 이벤트 루프가있을 때 일반적으로 사용하는 용어로, 클릭 버튼, 데이터 도착 등의 이벤트에 의해 구동되는 앱을 의미합니다. 일반적으로 그러한 이벤트에 대한 콜백.