2012-01-11 4 views
1

나는 express로 node.js를 테스트하고있다.node.js를 사용할 때 for 루프 비동기 방식을 사용해야합니까?

이론적으로, 나는 어떤 콜백없이 "루프"에 뭔가 매우 무거운 계산을 실행하면

이 차단 등의 요청이 무시해야합니다.

하지만 내 경우

, 일반적인 "루프"

for(var i=0;i<300000;i++) { 
    console.log(i); 
} 

는 요청 블록하지만, 단지 높은 CPU 부하를하지 않습니다.

다른 요청도 받아들입니다.

하지만 난 할 몇 가지 다른 방법을 사용해야하는 이유 이러한 비 차단 등

process.nextTick() 

을 또는 (반면에) process.nextTick로 포장하여 기본 루프 기능을 돌볼 Node.js를 수행()을 기본값으로 사용 하시겠습니까?

답변

2

노드는 이벤트 루프가있는 단일 스레드에서 실행되므로 for 루프가 실행될 때 다른 처리는 수행되지 않습니다. 기본 운영 체제 TCP 소켓은 들어오는 연결을 매우 잘 수용 할 수 있지만 루핑 논리를 수행하는 노드가 바쁜 경우 요청 자체는 이후까지 처리되지 않습니다.

Node에서 장기 실행 프로세스를 반드시 실행해야하는 경우 별도의 작업자 프로세스를 사용하여 계산을 수행하고 요청 처리를 수행하도록 기본 이벤트 루프를 그대로 두어야합니다.

+0

"for 루프"에서 process.nextTick을 사용하는 것과 "for 루프"에서 process.nextTick을 사용하지 않는 것의 차이점 – InspiredJW

+2

스 니펫을 사용하면 더 나은 대답을 얻을 수 있지만 기본적으로 nextTick을 사용하지 않으면 루프가 다른 언어와 같이 실행됩니다. 'i'의 모든 값을 통과 할 때까지 실행되고 다른 처리는 일어나지 않습니다. nextTick은 다음 번에 이벤트 루프를 통해 인수 함수를 실행하도록 노드에 지시합니다. 이론적으로 이는 이벤트 루프에서 처리 할 수 ​​있도록 다른 모든 작업과 함께 대기중인 것을 의미합니다. 즉, 들어오는 요청과 같이 다른 데이터가 처리 될 때가 있습니다. 즉, 메인 루프는 여전히 나쁠 수있는 무거운 프로세싱을 많이 할 것입니다. – loganfsmyth

0

노드는 process.nextTick()으로 루프를 래핑하지 않습니다.

console.log이 메인 이벤트 루프를 다시 제어하기 때문에 프로그램에서 새 연결을 계속 받아 들일 수 있습니다. I/O 작업이기 때문에

관련 문제