2011-03-05 4 views
129

올바르게 이해한다면 노드 JS는 블로킹이 아닙니다 ... 그래서 데이터베이스 나 다른 프로세스의 응답을 기다리는 대신 다른 것으로 옮겨서 나중에 다시 확인합니다.멀티 스레딩 대신 노드 JS 파악하기

또한 단일 스레드입니다.

이 모든 것은 특정 노드 JS 프로세스가 단일 CPU 코어를 완전하고 효율적으로 사용할 수 있지만 컴퓨터에서 다른 코어를 사용하지 않는다는 것을 의미합니다. 한 번에 둘 이상을 사용하지 않습니다.

이것은 당연히 다른 프로세스가 SQL 데이터베이스 또는 다른 의도적으로 분리 된 CPU 과도한 서브 루틴과 같은 다른 프로세스에서 다른 프로세스에 의해 사용될 수 있다는 것을 의미합니다.

또한 노드 JS 프로세스에 무한 루프 또는 장기 실행 기능이있는 경우 무한 루프 또는 장기 실행 기능이 중지되거나 전체 프로세스가 종료 될 때까지 해당 프로세스가 더 이상 유용하지 않습니다.

이 모든 것이 맞습니까? 내 이해가 정확합니까?

+2

는 "노드는"_not_ 단일 스레드입니다 (대신 WebAPIs의 Node.js를에서 C++ API가있다). JS/V8 엔진 만 단일 스레드에서 실행됩니다. NodeJS의 libuv 부분은 멀티 스레드입니다. [NodeJS는 실제로 단일 스레드입니까?] (http://stackoverflow.com/questions/7018093/is-nodejs-really-single-threaded) – RaelB

+1

후킹 http://stackoverflow.com/q/17959663/632951 – Pacerier

답변

84

상당히 정확합니다. 예. node.js 서버는 내부 스레드 풀을 가지고 있으므로 블로킹 작업을 수행하고 완료 될 때 콜백 또는 이벤트로 메인 스레드에 알릴 수 있습니다.

따라서 스레드 풀에 대해 다른 코어를 제한적으로 사용하게 될 것이라고 생각합니다. 예를 들어 비 차단 파일 시스템을 읽는 경우 스레드 풀에서 읽기 및 쓰기를 수행하도록 스레드를 말하면 읽기가 가능합니다. 끝나면 콜백을 설정합니다. 이는 메인 node.js 프로그램이 다른 작업을 수행하는 동안 다른 스레드/코어에서 읽기가 일어날 수 있음을 의미합니다.

node.js의 관점에서 보자면 완전히 단일 스레드이며 둘 이상의 코어를 직접 사용하지 않습니다.

+2

저는 Node.js를 아직 사용하지 않아서 여기에 대해 감사드립니다. 비 차단 호출이 스레드 차단 호출에 의해 뒷받침된다는 가정을하는 것이 현명한 방법이 아니라는 점을 지적하고자합니다. @jcoder가 이러한 가정을 중심으로 코드를 설계하는 것이 아닙니다. 이 경우, IO가 블로킹 콜이있는 별도의 스레드에서 처리 되더라도, 그 스레드는 기본적으로 IO를 대기하게되므로 다른 코어/CPU를 사용하지 않게됩니다. 사용하고있는 도구의 강점을 코드화하고, 문제가 될 때까지 낮은 수준의 세부 정보에 대해 너무 걱정하지 마십시오. – wbyoung

+0

프론트 엔드에서 javascript 코드와 같은 콜백을 사용하여 다른 프레이즈를 수행 할 수 있습니다. – yussan

35

예, 귀하의 이해가 완전히 정확하다고 말하고 싶습니다. This article (archived)은이 디자인의 근거를 매우 잘 설명합니다. 이것은 아마도 가장 중요한 단락 일 것입니다 :

아파치는 다중 스레드입니다 : 요청 당 스레드가 생성됩니다 (또는 프로세스, conf에 따라 다름). 동시 연결 수가 늘어나고 여러 개의 동시 클라이언트를 처리하는 데 더 많은 스레드가 필요할 때 오버 헤드가 어떻게 메모리를 소비하는지 확인할 수 있습니다. Nginx와 Node.js는 스레드와 프로세스가 많은 메모리를 소비하기 때문에 다중 스레드되지 않습니다. 이들은 단일 스레드이지만 이벤트 기반입니다. 이것은 단일 스레드에서 많은 연결을 처리하여 수천 개의 스레드/프로세스에 의해 생성 된 오버 헤드를 제거합니다.

+0

기사가 거짓입니다. 다중 스레드 아파치 (mpm)가 존재하지만, 실제로 사용되는 모든 구성과 호환되지 않습니다. 아파치는 멀티 프로세스이며, 지금까지는 멀티 스레드가 아니며 아마도 영원 할 것이다. 나는 그 용어의 적절한 의미를 조작하는 것은 비극적 인 것이라고 생각한다. 문제를 숨기고 문제를 해결하는 좋은 시도 일 뿐이다. – peterh

+1

@peterh 너는 말이 안되는구나. 이 기사는 아파치가 다중 프로세스이거나 설정에 따라 다중 쓰레드임을 나타내는 완전히 정확하다. multiproces의 경우는 많은 연결을 처리하는 것과 관련하여 더 나쁘다. 이것이 Apache가 처음 언급 된 유일한 이유이다. 또한 매우 일반적으로 사용되는 PHP 모듈은 모두 자체적으로 멀티 스레드됩니다. 마지막으로, 제가 아파치 전문가는 아니지만 다른 기사에서 얻은 인상은 실제로 작업자 MPM이 실제로 매우 일반적으로 사용된다는 것입니다. –

+0

@MichaelBorgwardt 예, 아파치는 멀티 스레드가 가능하며 다중 프로세스도 가능합니다. 부인하지 않았습니다. 하지만 PHP는 다중 프로세스 구성과 호환되지 않습니다. 아파치 전문가라면 분명히 알 것입니다. 매우 일반적으로 사용되는 PHP 모듈은 멀티 스레드되지 않습니다. 귀하의 정보는 거짓입니다. 테스트 구성을 시도해 볼 것을 권유합니다. 그것은 논쟁의 문제가 아닌 사실적인 것입니다. 시도해보십시오. – peterh

13

이 질문이 거의 2 년 전에 요청 되었기 때문에. 상황이 달라 지거나 Node.JS의 멀티 스레딩 문제에 대한 대체 접근법이 있습니다.

들어오는 '작업'확장을 사용하는 블로그 게시물에 따르면 일부는 다른 사용 가능한 코어를 직접 활용할 수 있습니다.

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

26

이 오래된 스레드가하더라도, 나는 Node.js를 응용 프로그램에서 둘 이상의 코어를 활용하는 방법을 생각, 함께 공유 할 것이라고 생각했다. Nuray Altin이 언급 한 것처럼 - JXcore은 그렇게 할 수 있습니다.

간단한 예 : 기본적으로

var method = function() { 
    console.log("this is message from thread no", process.threadId); 
}; 

jxcore.tasks.runOnThread(0, method); 
jxcore.tasks.runOnThread(1, method); 

// this is message from thread no 1 
// this is message from thread no 0 

두 개의 스레드가 당신이 작업을 할 수있는 훨씬 더가 물론

(당신은 jxcore.tasks.setThreadCount()로 변경할 수 있습니다). 문서는 here입니다. 그 주제에

몇몇 기사 :

1

Node.js를 단일 스레드 응용 프로그램이지만 이벤트와 콜백의 개념을 통해 동시성을 지원할 수 있습니다. 여기 비디오가 Philip Roberts에 의해 어떻게 event-loops가 javascript에서 작동하는지 설명합니다.

Click here to see the video

+2

댓글이어야합니다. – Cherniv