멀티 스레딩의 Node JS 대안 파악


142

올바르게 이해하면 Node JS가 차단되지 않습니다 ... 그래서 데이터베이스 또는 다른 프로세스의 응답을 기다리는 대신 다른 것으로 이동하여 나중에 다시 확인합니다.

또한 단일 스레드입니다.

이 모든 것은 주어진 Node JS 프로세스가 단일 CPU 코어를 완벽하고 효율적으로 사용할 수 있지만 머신에서 다른 코어를 사용하지는 않는다는 것을 의미합니다.

이것은 물론 다른 CPU가 별도의 프로세스 인 한 다른 데이터베이스에서 SQL 데이터베이스 또는 의도적으로 분리 된 다른 CPU 헤비 서브 루틴과 같은 프로세스에 여전히 사용될 수 있음을 의미합니다.

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

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


2
"노드"는 단일 스레드 가 아닙니다 . JS / V8 엔진 만 단일 스레드에서 실행됩니다. NodeJS의 libuv 부분은 다중 스레드입니다. NodeJS가 실제로 단일 스레드입니까?를
RaelB

답변:


87

그렇습니다. node.js 서버에는 내부 스레드 풀이 있으므로 차단 작업을 수행하고 작업이 완료되면 콜백 또는 이벤트로 기본 스레드에 알릴 수 있습니다.

따라서 스레드 풀에 다른 코어를 제한적으로 사용한다고 생각합니다. 예를 들어 비 블로킹 파일 시스템 읽기를 수행하는 경우 스레드 풀에서 스레드에게 읽기를 수행하고 콜백을 설정하도록 지시하면 구현됩니다. 메인 node.js 프로그램이 다른 것을 수행하는 동안 다른 스레드 / 코어에서 읽기가 발생할 수 있음을 의미합니다.

그러나 node.js의 관점에서 볼 때, 그것은 완전히 단일 스레드이며 둘 이상의 코어를 직접 사용하지 않습니다.


2
나는 여전히 Node.js를 처음 사용하며 여기에서 토론을 주셔서 감사합니다. 비 차단 호출이 스레드 차단 호출에 의해 뒷받침된다는 가정을하는 것이 현명하지 않다는 것을 지적하고 싶었습니다 (@jcoder가 이러한 가정을 중심으로 코드를 설계하도록 제안한 것은 아닙니다). 이 경우 IO가 차단 호출로 별도의 스레드에서 처리 되더라도 해당 스레드는 기본적으로 IO를 대기하므로 다른 코어 / CPU를 사용하지 않습니다. 사용중인 도구의 강도에 따라 코드를 작성하고 낮은 수준의 세부 정보에 대해 너무 걱정하지 마십시오 (문제가 될 때까지).
wbyoung

프론트 엔드에서 자바 스크립트 코드와 같은 콜백을 사용하여 다른 제안을 할 수 있습니다
yussan

37

네, 당신의 이해는 전적으로 정확하다고 말하고 싶습니다. 이 기사 ( 보관 됨 )는이 디자인의 근거를 아주 잘 설명합니다. 아마도 가장 중요한 단락 일 것입니다.

아파치는 멀티 스레드입니다 : 요청 당 스레드를 생성합니다 (또는 프로세스는 conf에 따라 다릅니다). 동시 연결 수가 증가하고 여러 동시 클라이언트에 서비스를 제공하기 위해 더 많은 스레드가 필요함에 따라 오버 헤드가 메모리를 차지하는 방식을 알 수 있습니다. 스레드와 프로세스는 메모리 비용이 많이 들기 때문에 Nginx와 Node.js는 멀티 스레드되지 않습니다. 단일 스레드이지만 이벤트 기반입니다. 이는 단일 스레드에서 많은 연결을 처리하여 수천 개의 스레드 / 프로세스로 인한 오버 헤드를 제거합니다.


기사가 허위입니다. 멀티 스레드 아파치 mpm이 존재하지만 실제로 사용되는 거의 모든 구성과 호환되지 않습니다. 아파치는 멀티 프로세스이며 지금까지 멀티 스레드되지 않았으며 아마도 영원히있을 것이다. 나는 그 용어의 적절한 의미를 조작하는 것이 치명적이라는 것을 알았습니다. 문제를 숨기는 대신 해결하는 것이 좋습니다.
peterh-Reinstate Monica

1
@peterh 말이되지 않습니다. 이 기사는 아파치가 구성에 따라 멀티 프로세스 또는 멀티 스레드임을 나타내는 완전히 정확합니다. 다중 연결 사례는 많은 연결 처리와 관련하여 훨씬 나쁩니다. 이것이 아파치가 처음 언급 된 유일한 이유입니다. 또한 가장 일반적으로 사용되는 PHP 모듈은 모두 자체적으로 멀티 스레딩됩니다. 마지막으로 아파치 전문가는 아니지만 다른 기사에서 필자는 MPM 작업자가 실제로 매우 일반적으로 사용된다는 인상을 받았습니다.
Michael Borgwardt

@MichaelBorgwardt 예, 아파치는 멀티 스레드 가능하며 멀티 프로세스 일 수 있습니다. 나는 그것을 거부하지 않았습니다. 그러나 PHP는 다중 프로세스 구성과 호환되지 않으며 아파치 전문가라면 반드시 알고 있습니다. 가장 일반적으로 사용되는 PHP 모듈은 다중 스레드가 아닙니다. 귀하의 정보는 허위입니다. 테스트 구성을 시도하는 것이 좋습니다. 그것은 논쟁의 문제가 아닌 사실적인 것이므로 시도해보십시오.
peterh-복 직원 모니카

27

이것이 오래된 스레드 일지라도 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())

물론 당신이 할 수있는 일이 훨씬 더 많습니다. 문서가 여기 있습니다 .

그 주제에 관한 기사는 거의 없습니다 :



1

Node.js는 단일 스레드 응용 프로그램이지만 이벤트 및 콜백 개념을 통해 동시성을 지원할 수 있습니다. 다음은 필립 로버츠 (Philip Roberts )의 비디오로 , 이벤트 루프가 자바 스크립트에서 어떻게 작동하는지 설명합니다.

비디오를 보려면 여기를 클릭하십시오

(WebAPI 대신 Node.js에 C ++ API가 있습니다)


2
이것은 의견이어야합니다
Cherniv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.