2012-08-30 4 views
3

하나의 요청이 실행되는 데 시간이 오래 걸리면 첫 번째 요청이 완료 될 때까지 다른 탭이 대기합니다. 왜? 설명해주세요. 어떻게 해결할 수 있을까요? 여기 내 코드 :Nodejs 하나의 요청이 다른 요청을 차단합니다.

var http = require("http"); 
var url = require("url"); 

http.createServer(function(request, response) { 

    if (url.parse(request.url).pathname == '/long') 
    { 
     function longlong() 
     { 
      var counter = 0; 
      var startTime = new Date().getTime(); 
      while (new Date().getTime() < startTime + 10000) 
      { 
       counter++; 
      } 
      return counter; 
     } 

     response.writeHead(200, {"Content-Type": "text/plain"}); 
     response.write(longlong() + ''); 
     response.end(); 
    } 
    else 
    { 
     response.writeHead(200, {"Content-Type": "text/plain"}); 
     response.write(0 + ''); 
     response.end(); 
    } 

}).listen(8888); 

답변

3

좋은 읽기 :

http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

것과 핵심 라인은 쓸 수 있습니다 :

는 는

이 ... 그러나, 모든 코드를 제외하고 병렬로 실행 는

그 비용을 의미 I/O는 비동기이어야하지만 코드가 차단 될 수 있습니다. 하지만 일반적으로 서버에서 차단하는 것이 걱정되는 것은 값 비싼 I/O입니다. Node.js blocking the event loop?

+0

'...하지만 코드를 제외하고는 모두 병렬로 실행됩니다. '대답은 – swapnilsarwe

+0

입니다. 고마워요. 알았어. – Mikhail

1

NodeJS는 (브라우저 자바 스크립트와 마찬가지로) 단일 스레드이기 때문에. 한 번에 하나의 코드 만 처리 할 수 ​​있습니다. NodeJS에는 비동기 방식으로 실행되는 매우 복잡한 코드 블록 큐가 있으므로 동시성이라는 환상을 얻습니다. 그러나 일단 블록이 처리되면 다른 블록을 동시에 처리 할 수 ​​없습니다.

NodeJS를 사용하면 모든 요청이 완료되었는지 (successfuly인지 여부) 확인해야합니다. 그렇지 않으면 모든 요청 (전체 요청뿐 아니라 서버)을 초과하여 충돌 할 수 있습니다.

또한 클래식 루프 대신 process.nextTick을 사용하면 요청이 더 빠르게 작동 할 수 있습니다 (확장 성이 향상 될 수 있습니다).

+0

내가 이것을 이해하지만, 어떻게 다른 (단순) 요청의 차단을 방지 할 수 있습니다 :

는 예와 자세한 내용이 다른 질문을 참조하십시오? 예를 들어 주시겠습니까 – Mikhail

+2

수 없습니다! ** 항상 ** 모든 다른 요청을 차단합니다. 정확히 무엇을 달성하고 싶습니까? 귀하의 요청 처리기는별로 의미가 없습니다. – freakish

+0

그것은 단지 예입니다. 현실 세계에서는 여러 개의 비동기 DB 요청에서 데이터를 수집하여 처리합니다. 재 그룹화, 평균 계산, 표시 준비 및 소요 시간은 약 10 초이지만 다른 요청은이 요청을 대기합니다. 나는 그것으로 일하는 방법을 이해하려고 노력한다. – Mikhail

관련 문제